Skip to content
This repository was archived by the owner on May 11, 2021. It is now read-only.

Commit

Permalink
add bitcoin peg transaction types
Browse files Browse the repository at this point in the history
  • Loading branch information
keppel committed Sep 3, 2019
1 parent 82b7ac0 commit 1d70a34
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 11 deletions.
26 changes: 17 additions & 9 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,15 @@ import {
Header,
BitcoinPegState,
BitcoinPegTx,
BitcoinPegContext
BitcoinPegContext,
BitcoinPegHeadersTx,
isHeadersTx,
isDepositTx,
BitcoinPegSignatoryCommitmentTx,
isSignatoryCommitmentTx,
isSignatureTx,
BitcoinPegSignatureTx,
BitcoinPegDepositTx
} from './types'
// TODO: get this from somewhere else
const { getTxHash } = require('bitcoin-net/src/utils.js')
Expand Down Expand Up @@ -80,16 +88,16 @@ let bitcoinPeg: any = function(
tx: BitcoinPegTx,
context: BitcoinPegContext
) {
if (tx.headers) {
if (isHeadersTx(tx)) {
// headers tx, add headers to chain
headersTx(state, tx, context)
} else if (tx.transactions) {
} else if (isDepositTx(tx)) {
// deposit tx, verify tx and collect UTXO(s)
depositTx(state, tx, context)
} else if (tx.signatoryKey) {
} else if (isSignatoryCommitmentTx(tx)) {
// signatory key tx, add validator's pubkey to signatory set
signatoryKeyTx(state, tx, context)
} else if (tx.signatures) {
} else if (isSignatureTx(tx)) {
// signature tx, add signatory's sig to outgoing transaction
signatureTx(state, tx, context)
} else {
Expand All @@ -101,7 +109,7 @@ let bitcoinPeg: any = function(
// verify and add to state
function headersTx(
state: BitcoinPegState,
tx: BitcoinPegTx,
tx: BitcoinPegHeadersTx,
context: BitcoinPegContext
) {
let chain = Blockchain({
Expand All @@ -123,7 +131,7 @@ let bitcoinPeg: any = function(
// then mint new coins to the recipient
function depositTx(
state: BitcoinPegState,
tx: BitcoinPegTx,
tx: BitcoinPegDepositTx,
context: BitcoinPegContext
) {
// get specified block header from state
Expand Down Expand Up @@ -218,7 +226,7 @@ let bitcoinPeg: any = function(
// while for bitcoin we need secp256k1 keys.
function signatoryKeyTx(
state: BitcoinPegState,
tx: BitcoinPegTx,
tx: BitcoinPegSignatoryCommitmentTx,
context: BitcoinPegContext
) {
let { signatoryIndex, signatoryKey, signature } = tx
Expand Down Expand Up @@ -256,7 +264,7 @@ let bitcoinPeg: any = function(
// signature tx, add signatory's sig to outgoing transaction
function signatureTx(
state: BitcoinPegState,
tx: BitcoinPegTx,
tx: BitcoinPegSignatureTx,
context: BitcoinPegContext
) {
let { signatoryIndex, signatures } = tx
Expand Down
48 changes: 46 additions & 2 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export enum KeyType {
}

export interface LightClient {
send(tx: any): Promise<any>
send(tx: BitcoinPegTx): Promise<any>
state: any
validators: Array<{
address: string
Expand Down Expand Up @@ -80,6 +80,12 @@ export interface Withdrawal {
amount: number
script: Buffer
}
export interface MerkleProof {
flags: number[]
hashes: Buffer[]
merkleRoot: Buffer
numTransactions: number
}

export interface BitcoinPegState {
chain: Header[]
Expand All @@ -94,7 +100,45 @@ export interface BitcoinPegState {
prevSignedTx: SignedTx | null
}

export type BitcoinPegTx = any
export interface BitcoinPegHeadersTx {
headers: Header[]
}
export function isHeadersTx(tx: any): tx is BitcoinPegHeadersTx {
return tx.headers instanceof Array
}
export interface BitcoinPegDepositTx {
transactions: []
height: number
proof: MerkleProof
}
export function isDepositTx(tx: any): tx is BitcoinPegDepositTx {
return tx.transactions instanceof Array
}
export interface BitcoinPegSignatoryCommitmentTx {
signatoryKey: Buffer
signatoryIndex: number
signature: Buffer
}
export function isSignatoryCommitmentTx(
tx: any
): tx is BitcoinPegSignatoryCommitmentTx {
return Buffer.isBuffer(tx.signatoryKey)
}

export interface BitcoinPegSignatureTx {
signatures: Buffer[]
signatoryIndex: number
}
export function isSignatureTx(tx: any): tx is BitcoinPegSignatureTx {
return tx.signatures instanceof Array
}

export type BitcoinPegTx = (
| BitcoinPegHeadersTx
| BitcoinPegDepositTx
| BitcoinPegSignatoryCommitmentTx
| BitcoinPegSignatureTx) & { type: 'bitcoin' }

export type BitcoinPegContext = any

// RPC types
Expand Down

0 comments on commit 1d70a34

Please sign in to comment.