11 pendingVerify *builderItem
14 type builderItem struct {
19 func (b *builder) add(opcodes string, newstack stack) stack {
20 if b.pendingVerify != nil {
21 b.items = append(b.items, b.pendingVerify)
24 item := &builderItem{opcodes: opcodes, stk: newstack}
25 if opcodes == "VERIFY" {
26 b.pendingVerify = item
28 b.items = append(b.items, item)
33 func (b *builder) addRoll(stk stack, n int) stack {
34 b.addInt64(stk, int64(n))
35 return b.add("ROLL", stk.roll(n))
38 func (b *builder) addDup(stk stack) stack {
39 return b.add("DUP", stk.dup())
42 func (b *builder) addInt64(stk stack, n int64) stack {
43 s := strconv.FormatInt(n, 10)
44 return b.add(s, stk.add(s))
47 func (b *builder) addNot(stk stack, desc string) stack {
48 return b.add("NOT", stk.drop().add(desc))
51 func (b *builder) addEqual(stk stack, desc string) stack {
52 return b.add("EQUAL", stk.dropN(2).add(desc))
55 func (b *builder) addNumEqual(stk stack, desc string) stack {
56 return b.add("NUMEQUAL", stk.dropN(2).add(desc))
59 func (b *builder) addJumpIf(stk stack, label string) stack {
60 return b.add(fmt.Sprintf("JUMPIF:$%s", label), stk.drop())
63 func (b *builder) addJumpTarget(stk stack, label string) stack {
64 return b.add("$"+label, stk)
67 func (b *builder) addDrop(stk stack) stack {
68 return b.add("DROP", stk.drop())
71 func (b *builder) forgetPendingVerify() {
75 func (b *builder) addJump(stk stack, label string) stack {
76 return b.add(fmt.Sprintf("JUMP:$%s", label), stk)
79 func (b *builder) addVerify(stk stack) stack {
80 return b.add("VERIFY", stk.drop())
83 func (b *builder) addData(stk stack, data []byte) stack {
89 s = strconv.FormatInt(int64(data[0]), 10)
91 s = fmt.Sprintf("0x%x", data)
93 return b.add(s, stk.add(s))
96 func (b *builder) addAmount(stk stack, desc string) stack {
97 return b.add("AMOUNT", stk.add(desc))
100 func (b *builder) addAsset(stk stack, desc string) stack {
101 return b.add("ASSET", stk.add(desc))
104 func (b *builder) addCheckOutput(stk stack, desc string) stack {
105 return b.add("CHECKOUTPUT", stk.dropN(5).add(desc))
108 func (b *builder) addBoolean(stk stack, val bool) stack {
110 return b.add("TRUE", stk.add("true"))
112 return b.add("FALSE", stk.add("false"))
115 func (b *builder) addOps(stk stack, ops string, desc string) stack {
116 return b.add(ops, stk.add(desc))
119 func (b *builder) addToAltStack(stk stack) (stack, string) {
121 return b.add("TOALTSTACK", stk.drop()), t
124 func (b *builder) addTxSigHash(stk stack) stack {
125 return b.add("TXSIGHASH", stk.add("<txsighash>"))
128 func (b *builder) addFromAltStack(stk stack, alt string) stack {
129 return b.add("FROMALTSTACK", stk.add(alt))
132 func (b *builder) addSwap(stk stack) stack {
133 return b.add("SWAP", stk.swap())
136 func (b *builder) addCheckMultisig(stk stack, n int, desc string) stack {
137 return b.add("CHECKMULTISIG", stk.dropN(n).add(desc))
140 func (b *builder) addOver(stk stack) stack {
141 return b.add("OVER", stk.over())
144 func (b *builder) addPick(stk stack, n int) stack {
145 b.addInt64(stk, int64(n))
146 return b.add("PICK", stk.pick(n))
149 func (b *builder) addCatPushdata(stk stack, desc string) stack {
150 return b.add("CATPUSHDATA", stk.dropN(2).add(desc))
153 func (b *builder) addCat(stk stack, desc string) stack {
154 return b.add("CAT", stk.dropN(2).add(desc))
157 func (b *builder) opcodes() string {
159 for _, item := range b.items {
160 ops = append(ops, item.opcodes)
162 return strings.Join(ops, " ")
165 // This is for producing listings like:
166 // 5 | [... <clause selector> borrower lender deadline balanceAmount balanceAsset 5]
167 // ROLL | [... borrower lender deadline balanceAmount balanceAsset <clause selector>]
168 // JUMPIF:$default | [... borrower lender deadline balanceAmount balanceAsset]
169 // $repay | [... borrower lender deadline balanceAmount balanceAsset]
170 // 0 | [... borrower lender deadline balanceAmount balanceAsset 0]
171 // 0 | [... borrower lender deadline balanceAmount balanceAsset 0 0]
172 // 3 | [... borrower lender deadline balanceAmount balanceAsset 0 0 3]
173 // ROLL | [... borrower lender deadline balanceAsset 0 0 balanceAmount]
174 // 3 | [... borrower lender deadline balanceAsset 0 0 balanceAmount 3]
175 // ROLL | [... borrower lender deadline 0 0 balanceAmount balanceAsset]
176 // 1 | [... borrower lender deadline 0 0 balanceAmount balanceAsset 1]
177 // 6 | [... borrower lender deadline 0 0 balanceAmount balanceAsset 1 6]
178 // ROLL | [... borrower deadline 0 0 balanceAmount balanceAsset 1 lender]
179 // CHECKOUTPUT | [... borrower deadline checkOutput(payment, lender)]
180 // VERIFY | [... borrower deadline]
181 // 1 | [... borrower deadline 1]
182 // 0 | [... borrower deadline 1 0]
183 // AMOUNT | [... borrower deadline 1 0 <amount>]
184 // ASSET | [... borrower deadline 1 0 <amount> <asset>]
185 // 1 | [... borrower deadline 1 0 <amount> <asset> 1]
186 // 6 | [... borrower deadline 1 0 <amount> <asset> 1 6]
187 // ROLL | [... deadline 1 0 <amount> <asset> 1 borrower]
188 // CHECKOUTPUT | [... deadline checkOutput(collateral, borrower)]
189 // JUMP:$_end | [... borrower lender deadline balanceAmount balanceAsset]
190 // $default | [... borrower lender deadline balanceAmount balanceAsset]
191 // 2 | [... borrower lender deadline balanceAmount balanceAsset 2]
192 // ROLL | [... borrower lender balanceAmount balanceAsset deadline]
193 // MINTIME LESSTHAN | [... borrower lender balanceAmount balanceAsset after(deadline)]
194 // VERIFY | [... borrower lender balanceAmount balanceAsset]
195 // 0 | [... borrower lender balanceAmount balanceAsset 0]
196 // 0 | [... borrower lender balanceAmount balanceAsset 0 0]
197 // AMOUNT | [... borrower lender balanceAmount balanceAsset 0 0 <amount>]
198 // ASSET | [... borrower lender balanceAmount balanceAsset 0 0 <amount> <asset>]
199 // 1 | [... borrower lender balanceAmount balanceAsset 0 0 <amount> <asset> 1]
200 // 7 | [... borrower lender balanceAmount balanceAsset 0 0 <amount> <asset> 1 7]
201 // ROLL | [... borrower balanceAmount balanceAsset 0 0 <amount> <asset> 1 lender]
202 // CHECKOUTPUT | [... borrower balanceAmount balanceAsset checkOutput(collateral, lender)]
203 // $_end | [... borrower lender deadline balanceAmount balanceAsset]
207 Opcodes string `json:"opcodes"`
208 Stack string `json:"stack"`
212 func (b *builder) steps() []Step {
214 for _, item := range b.items {
215 result = append(result, Step{item.opcodes, item.stk.String()})