@xo-cash/templates 0.0.1-development.13733087628 → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,7 +4,6 @@ XO templates
4
4
 
5
5
  > ⚠️ This project is in **early development phase**. Use it only if you understand what you are doing and accept the risks. **Do not use funds you are not willing to lose.** Minor version bumps may introduce **breaking changes**
6
6
 
7
-
8
7
  ## Installation
9
8
 
10
9
  ```bash
package/dist/index.mjs CHANGED
@@ -4,7 +4,7 @@ const p2pkhTemplate = {
4
4
  name: "Wallet (P2PKH)",
5
5
  description: "A standard single-factor wallet template that uses Pay-to-Public-Key-Hash (P2PKH) locking scripts.",
6
6
  icon: "wallet",
7
- version: 0,
7
+ version: "1",
8
8
  supported: [
9
9
  "BCH_2023_05",
10
10
  "BCH_2024_05",
@@ -74,7 +74,7 @@ const p2pkhTemplate = {
74
74
  requirements: {}
75
75
  }
76
76
  },
77
- requirements: { roles: [{
77
+ requirements: { participants: [{
78
78
  role: "receiver",
79
79
  slots: {
80
80
  min: 1,
@@ -110,7 +110,7 @@ const p2pkhTemplate = {
110
110
  requirements: {}
111
111
  }
112
112
  },
113
- requirements: { roles: [{
113
+ requirements: { participants: [{
114
114
  role: "receiver",
115
115
  slots: {
116
116
  min: 1,
@@ -146,7 +146,7 @@ const p2pkhTemplate = {
146
146
  requirements: {}
147
147
  }
148
148
  },
149
- requirements: { roles: [{
149
+ requirements: { participants: [{
150
150
  role: "receiver",
151
151
  slots: {
152
152
  min: 1,
@@ -186,7 +186,7 @@ const p2pkhTemplate = {
186
186
  requirements: {}
187
187
  }
188
188
  },
189
- requirements: { roles: [{
189
+ requirements: { participants: [{
190
190
  role: "receiver",
191
191
  slots: {
192
192
  min: 1,
@@ -209,14 +209,14 @@ const p2pkhTemplate = {
209
209
  variables: ["transferredSatoshis", "recipientLockingscript"],
210
210
  secrets: ["ownerKey"]
211
211
  } } },
212
- requirements: { roles: [{
212
+ requirements: { participants: [{
213
213
  role: "sender",
214
214
  slots: {
215
215
  min: 1,
216
216
  max: 1
217
217
  }
218
218
  }] },
219
- condition: "$(OP_INPUTINDEX OP_UTXOVALUE <dustLimit> OP_GREATERTHAN)",
219
+ conditions: ["$(OP_INPUTINDEX OP_UTXOVALUE <dustLimit> OP_GREATERTHAN)"],
220
220
  transaction: "transferSatoshisTransaction"
221
221
  },
222
222
  sendFungibleTokens: {
@@ -231,14 +231,14 @@ const p2pkhTemplate = {
231
231
  ],
232
232
  secrets: ["ownerKey"]
233
233
  } } },
234
- requirements: { roles: [{
234
+ requirements: { participants: [{
235
235
  role: "sender",
236
236
  slots: {
237
237
  min: 1,
238
238
  max: 1
239
239
  }
240
240
  }] },
241
- condition: "$(OP_INPUTINDEX OP_UTXOTOKENAMOUNT <0> OP_GREATERTHAN)",
241
+ conditions: ["$(OP_INPUTINDEX OP_UTXOTOKENAMOUNT <0> OP_GREATERTHAN)"],
242
242
  transaction: "transferFungibleTokensTransaction"
243
243
  },
244
244
  sendNonfungibleTokens: {
@@ -254,14 +254,14 @@ const p2pkhTemplate = {
254
254
  ],
255
255
  secrets: ["ownerKey"]
256
256
  } } },
257
- requirements: { roles: [{
257
+ requirements: { participants: [{
258
258
  role: "sender",
259
259
  slots: {
260
260
  min: 1,
261
261
  max: 1
262
262
  }
263
263
  }] },
264
- condition: "$(OP_INPUTINDEX OP_UTXOTOKENCATEGORY OP_SIZE OP_NIP <32> OP_GREATERTHAN)",
264
+ conditions: ["$(OP_INPUTINDEX OP_UTXOTOKENCATEGORY OP_SIZE OP_NIP <32> OP_GREATERTHAN)"],
265
265
  transaction: "transferNonfungibleTokensTransaction"
266
266
  },
267
267
  burnFungibleTokens: {
@@ -272,14 +272,14 @@ const p2pkhTemplate = {
272
272
  variables: ["burnedTokenCategory", "burnedTokenAmount"],
273
273
  secrets: ["ownerKey"]
274
274
  } } },
275
- requirements: { roles: [{
275
+ requirements: { participants: [{
276
276
  role: "owner",
277
277
  slots: {
278
278
  min: 1,
279
279
  max: 1
280
280
  }
281
281
  }] },
282
- condition: "$(OP_INPUTINDEX OP_UTXOTOKENAMOUNT <0> OP_GREATERTHAN)",
282
+ conditions: ["$(OP_INPUTINDEX OP_UTXOTOKENAMOUNT <0> OP_GREATERTHAN)"],
283
283
  transaction: "burnFungibleTokensTransaction"
284
284
  },
285
285
  burnNonfungibleTokens: {
@@ -294,14 +294,14 @@ const p2pkhTemplate = {
294
294
  ],
295
295
  secrets: ["ownerKey"]
296
296
  } } },
297
- requirements: { roles: [{
297
+ requirements: { participants: [{
298
298
  role: "owner",
299
299
  slots: {
300
300
  min: 1,
301
301
  max: 1
302
302
  }
303
303
  }] },
304
- condition: "$(OP_INPUTINDEX OP_UTXOTOKENCATEGORY OP_SIZE OP_NIP <32> OP_GREATERTHAN)",
304
+ conditions: ["$(OP_INPUTINDEX OP_UTXOTOKENCATEGORY OP_SIZE OP_NIP <32> OP_GREATERTHAN)"],
305
305
  transaction: "burnNonfungibleTokenTransaction"
306
306
  },
307
307
  sign: {
@@ -312,14 +312,14 @@ const p2pkhTemplate = {
312
312
  variables: ["messageToSign"],
313
313
  secrets: ["ownerKey"]
314
314
  } } },
315
- requirements: { roles: [{
315
+ requirements: { participants: [{
316
316
  role: "owner",
317
317
  slots: {
318
318
  min: 1,
319
319
  max: 1
320
320
  }
321
321
  }] },
322
- data: ["messageSignature"]
322
+ data: "messageSignature"
323
323
  },
324
324
  verify: {
325
325
  name: "Verify Message Signature",
@@ -329,14 +329,14 @@ const p2pkhTemplate = {
329
329
  variables: ["messageSignature", "messageToVerify"],
330
330
  secrets: ["ownerKey"]
331
331
  } } },
332
- requirements: { roles: [{
332
+ requirements: { participants: [{
333
333
  role: "owner",
334
334
  slots: {
335
335
  min: 1,
336
336
  max: 1
337
337
  }
338
338
  }] },
339
- data: ["messageSignatureValidity"]
339
+ data: "messageSignatureValidity"
340
340
  }
341
341
  },
342
342
  data: {
@@ -371,7 +371,7 @@ const p2pkhTemplate = {
371
371
  inputs: [],
372
372
  outputs: [{
373
373
  output: "receiveOutput",
374
- index: void 0
374
+ outputIndex: void 0
375
375
  }],
376
376
  version: 2,
377
377
  locktime: 0,
@@ -396,7 +396,7 @@ const p2pkhTemplate = {
396
396
  inputs: [],
397
397
  outputs: [{
398
398
  output: "requestSatoshisOutput",
399
- index: void 0
399
+ outputIndex: void 0
400
400
  }],
401
401
  version: 2,
402
402
  locktime: 0,
@@ -421,7 +421,7 @@ const p2pkhTemplate = {
421
421
  inputs: [],
422
422
  outputs: [{
423
423
  output: "requestFungibleTokensOutput",
424
- index: void 0
424
+ outputIndex: void 0
425
425
  }],
426
426
  version: 2,
427
427
  locktime: 0,
@@ -446,7 +446,7 @@ const p2pkhTemplate = {
446
446
  inputs: [],
447
447
  outputs: [{
448
448
  output: "requestNonfungibleTokensOutput",
449
- index: void 0
449
+ outputIndex: void 0
450
450
  }],
451
451
  version: 2,
452
452
  locktime: 0,
@@ -471,7 +471,7 @@ const p2pkhTemplate = {
471
471
  inputs: [],
472
472
  outputs: [{
473
473
  output: "transferSatoshisOutput",
474
- index: void 0
474
+ outputIndex: void 0
475
475
  }],
476
476
  version: 2,
477
477
  locktime: 0,
@@ -496,7 +496,7 @@ const p2pkhTemplate = {
496
496
  inputs: [],
497
497
  outputs: [{
498
498
  output: "transferFungibleTokensOutput",
499
- index: void 0
499
+ outputIndex: void 0
500
500
  }],
501
501
  version: 2,
502
502
  locktime: 0,
@@ -521,7 +521,7 @@ const p2pkhTemplate = {
521
521
  inputs: [],
522
522
  outputs: [{
523
523
  output: "transferNonfungibleTokenOutput",
524
- index: void 0
524
+ outputIndex: void 0
525
525
  }],
526
526
  version: 2,
527
527
  locktime: 0,
@@ -533,7 +533,7 @@ const p2pkhTemplate = {
533
533
  icon: "burn",
534
534
  inputs: [{
535
535
  input: "burnFungibleTokensInput",
536
- index: void 0
536
+ inputIndex: void 0
537
537
  }],
538
538
  outputs: [],
539
539
  version: 2,
@@ -546,7 +546,7 @@ const p2pkhTemplate = {
546
546
  icon: "burn",
547
547
  inputs: [{
548
548
  input: "burnNonfungibleTokenInput",
549
- index: void 0
549
+ inputIndex: void 0
550
550
  }],
551
551
  outputs: [],
552
552
  version: 2,
@@ -559,7 +559,7 @@ const p2pkhTemplate = {
559
559
  name: "Change",
560
560
  description: "Funds returned as change.",
561
561
  icon: "receive",
562
- lockscript: "receivingLockingScript"
562
+ lockingScript: "receivingLockingScript"
563
563
  },
564
564
  receiveOutput: {
565
565
  name: "Recipient output",
@@ -575,7 +575,7 @@ const p2pkhTemplate = {
575
575
  description: "Sent an unspecified amount of cash and/or tokens."
576
576
  }
577
577
  },
578
- lockscript: "receivingLockingScript"
578
+ lockingScript: "receivingLockingScript"
579
579
  },
580
580
  requestSatoshisOutput: {
581
581
  name: "Satoshis",
@@ -591,7 +591,7 @@ const p2pkhTemplate = {
591
591
  description: "Sent $(<requestedSatoshis>) satoshis."
592
592
  }
593
593
  },
594
- lockscript: "receivingLockingScript",
594
+ lockingScript: "receivingLockingScript",
595
595
  valueSatoshis: "$(<requestedSatoshis>)",
596
596
  token: null
597
597
  },
@@ -609,7 +609,7 @@ const p2pkhTemplate = {
609
609
  description: "Sent $(<requestedTokenAmount> <requestedTokenCategory.decimalsFactor> OP_DIV).$(<requestedTokenAmount> <requestedTokenCategory.decimalsFactor> OP_MOD) $(<requestedTokenCategory.symbol>) tokens."
610
610
  }
611
611
  },
612
- lockscript: "receivingLockingScript",
612
+ lockingScript: "receivingLockingScript",
613
613
  valueSatoshis: "1000",
614
614
  token: {
615
615
  category: "$(<requestedTokenCategory>)",
@@ -631,7 +631,7 @@ const p2pkhTemplate = {
631
631
  description: "Sent the requested non-fungible $(<requestedTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <requestedTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) $(<requestedTokenCategory.symbol>) token, with $(<requestedTokenCommitment>) commitment."
632
632
  }
633
633
  },
634
- lockscript: "receivingLockingScript",
634
+ lockingScript: "receivingLockingScript",
635
635
  valueSatoshis: "1000",
636
636
  token: {
637
637
  category: "$(<requestedTokenCategory>)",
@@ -656,7 +656,7 @@ const p2pkhTemplate = {
656
656
  description: "Sent $(<transferredSatoshis>) satoshis."
657
657
  }
658
658
  },
659
- lockscript: "sendingLockingscript",
659
+ lockingScript: "sendingLockingscript",
660
660
  valueSatoshis: "$(<transferredSatoshis>)"
661
661
  },
662
662
  transferFungibleTokensOutput: {
@@ -673,7 +673,7 @@ const p2pkhTemplate = {
673
673
  description: "Sent $(<transferredTokenAmount> <transferredTokenCategory.decimalsFactor> OP_DIV).$(<transferredTokenAmount> <transferredTokenCategory.decimalsFactor> OP_MOD) $(<transferredTokenCategory.symbol>) tokens."
674
674
  }
675
675
  },
676
- lockscript: "sendingLockingscript",
676
+ lockingScript: "sendingLockingscript",
677
677
  token: {
678
678
  category: "$(<transferredTokenCategory>)",
679
679
  amount: "$(<transferredTokenAmount>)"
@@ -693,7 +693,7 @@ const p2pkhTemplate = {
693
693
  description: "Sent one non-fungible $(<transferredTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <transferredTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) $(<transferredTokenCategory.symbol>) token, with $(<transferredTokenCommitment>) commitment."
694
694
  }
695
695
  },
696
- lockscript: "sendingLockingscript",
696
+ lockingScript: "sendingLockingscript",
697
697
  token: {
698
698
  category: "$(<transferredTokenCategory>)",
699
699
  nft: {
@@ -735,22 +735,23 @@ const p2pkhTemplate = {
735
735
  name: "Sent",
736
736
  description: "Funds sent to an external recipient",
737
737
  icon: "address",
738
- lockingType: "standard",
739
- lockingScript: "lockToRecipient",
738
+ lockingType: "p2pkh",
739
+ lockingBytecode: "lockToRecipient",
740
740
  actions: [],
741
- state: [],
742
- secrets: [],
743
- balance: false,
744
- selectable: false,
745
- privacy: false
741
+ state: {
742
+ variables: [],
743
+ secrets: []
744
+ },
745
+ balance: {},
746
+ selectable: false
746
747
  },
747
748
  receivingLockingScript: {
748
749
  name: "Received",
749
750
  description: "Funds received without wallet coordination.",
750
751
  icon: "address",
751
- lockingType: "standard",
752
- lockingScript: "lockP2PKH",
753
- unlockingScript: "unlockP2PKH",
752
+ lockingType: "p2pkh",
753
+ lockingBytecode: "lockP2PKH",
754
+ unlockingBytecode: "unlockP2PKH",
754
755
  actions: [],
755
756
  roles: { receiver: {
756
757
  state: {
@@ -761,45 +762,45 @@ const p2pkhTemplate = {
761
762
  {
762
763
  action: "sign",
763
764
  role: "owner",
764
- secrets: ["ownerKey"]
765
+ secrets: [{ ownerKey: null }]
765
766
  },
766
767
  {
767
768
  action: "verify",
768
769
  role: "owner",
769
- secrets: ["ownerKey"]
770
+ secrets: [{ ownerKey: null }]
770
771
  },
771
772
  {
772
773
  action: "sendSatoshis",
773
774
  role: "sender",
774
- secrets: ["ownerKey"]
775
+ secrets: [{ ownerKey: null }]
775
776
  },
776
777
  {
777
778
  action: "sendFungibleTokens",
778
779
  role: "sender",
779
- secrets: ["ownerKey"]
780
+ secrets: [{ ownerKey: null }]
780
781
  },
781
782
  {
782
783
  action: "sendNonfungibleTokens",
783
784
  role: "sender",
784
- secrets: ["ownerKey"]
785
+ secrets: [{ ownerKey: null }]
785
786
  },
786
787
  {
787
788
  action: "burnFungibleTokens",
788
789
  role: "sender",
789
- secrets: ["ownerKey"]
790
+ secrets: [{ ownerKey: null }]
790
791
  },
791
792
  {
792
793
  action: "burnNonfungibleTokens",
793
794
  role: "sender",
794
- secrets: ["ownerKey"]
795
+ secrets: [{ ownerKey: null }]
795
796
  }
796
797
  ],
797
798
  balance: {
798
799
  satoshis: true,
799
- fungibleTokens: true
800
+ fungibleTokens: true,
801
+ nonfungibleTokens: true
800
802
  },
801
- selectable: true,
802
- privacy: false
803
+ selectable: true
803
804
  } }
804
805
  }
805
806
  },
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../source/p2pkh.ts"],"sourcesContent":["import type { XOTemplate } from '@xo-cash/types';\n\nexport const p2pkhTemplate: XOTemplate = {\n $schema: 'https://libauth.org/schemas/wallet-template-v0.schema.json',\n\n // Name for this template.\n name: 'Wallet (P2PKH)',\n\n // Description for this template.\n description: 'A standard single-factor wallet template that uses Pay-to-Public-Key-Hash (P2PKH) locking scripts.',\n\n // Icon for this template.\n icon: 'wallet',\n\n // Version number for this template.\n version: 0,\n\n // List of VM versions that can be used to run this template.\n supported: [ 'BCH_2023_05', 'BCH_2024_05', 'BCH_2025_05', 'BCH_2026_05' ],\n\n // Sets optional default values to be used with this template.\n defaults: {\n // Configures a default intent structure for creating change outputs and locking scripts.\n // NOTE: This is used when the engine needs to make change for an output created by\n // this template and there is no other policy provided elsewhere that takes precedence.\n // NOTE: It is recommended that templates that create outputs with the 'selectable' property\n // either provides a change policy here, or a comment that explain that they\n // intentionally omit the change policy and why.\n change: {\n output: 'changeOutput',\n role: 'receiver',\n generate: [ 'ownerKey' ],\n },\n },\n\n // Describe a list of roles that are used in this template.\n // NOTE: Template roles are held only for the duration of one specific action/invitation.\n // For example, the same entity that acts as 'receiver' when creating/receiving an output\n // can later act as 'sender' (or 'owner') when performing a follow-up action.\n roles: {\n owner: {\n name: 'Wallet Owner',\n description: 'The party who can spend from this wallet.',\n icon: 'owner',\n },\n receiver: {\n name: 'Receiver',\n description: 'A party that is receiving value.',\n icon: 'receiver',\n },\n sender: {\n name: 'Sender',\n description: 'A party that is sending value.',\n icon: 'sender',\n },\n },\n\n // Define a list of entrypoints supported by this template.\n start: [\n {\n action: 'receive',\n role: 'receiver',\n generate: [ 'ownerKey' ],\n },\n {\n action: 'requestSatoshis',\n role: 'receiver',\n generate: [ 'ownerKey' ],\n },\n {\n action: 'requestFungibleTokens',\n role: 'receiver',\n generate: [ 'ownerKey' ],\n },\n {\n action: 'requestNonfungibleTokens',\n role: 'receiver',\n generate: [ 'ownerKey' ],\n },\n ],\n\n // Define a list of actions that can be taken by this template.\n // NOTE: There is no action to generate an address, but a wallet can create an invitation to a receive action and\n // extract the generated lockscript as needed as the engine will track all lockscripts it generates.\n actions: {\n receive: {\n // TODO: Consider rewriting to be generic/role-less.\n name: 'Receive',\n description: 'Receive an unspecified amount of cash and/or tokens from one or more senders.',\n icon: 'receive',\n\n roles: {\n receiver: {\n name: 'Receive',\n description: 'Receive an unspecified amount of cash and/or tokens from one or more senders.',\n icon: 'receive',\n\n requirements: {\n secrets: [ 'ownerKey' ],\n },\n },\n sender: {\n name: 'Send',\n description: 'Send an unspecified amount of cash and/or tokens to the provided receiver.',\n icon: 'send',\n\n // The sender only need to provide blockchain-level requirements.\n // NOTE: This field is not required when empty, but shown here for illustrative purposes.\n requirements: {},\n },\n },\n\n requirements: {\n roles: [\n {\n role: 'receiver',\n slots: { min: 1, max: 1 },\n },\n {\n role: 'sender',\n slots: { min: 1, max: undefined },\n },\n ],\n },\n\n transaction: 'receiveTransaction',\n },\n requestSatoshis: {\n // TODO: Consider rewriting to be generic/role-less.\n name: 'Request Satoshis',\n description: 'Requests a specific amount of Bitcoin Cash from one or more senders.',\n icon: 'request',\n\n roles: {\n receiver: {\n name: 'Request Satoshis',\n description: 'Requests a specific amount of Bitcoin Cash from one or more senders.',\n icon: 'request',\n\n requirements: {\n secrets: [ 'ownerKey' ],\n variables: [ 'requestedSatoshis' ],\n },\n },\n sender: {\n name: 'Send',\n description: 'Send a specific amount of Bitcoin Cash to the provided receiver.',\n icon: 'send',\n\n // The sender only need to provide blockchain-level requirements.\n // NOTE: This field is not required when empty, but shown here for illustrative purposes.\n requirements: {},\n },\n },\n\n requirements: {\n roles: [\n {\n role: 'receiver',\n slots: { min: 1, max: 1 },\n },\n {\n role: 'sender',\n slots: { min: 1, max: undefined },\n },\n ],\n },\n\n transaction: 'requestSatoshisTransaction',\n },\n requestFungibleTokens: {\n // TODO: Consider rewriting to be generic/role-less.\n name: 'Request Fungible Tokens',\n description: 'Requests a specific amount of a fungible tokens from one or more senders.',\n icon: 'request',\n\n roles: {\n receiver: {\n name: 'Request Fungible Tokens',\n description: 'Requests a specific amount of a fungible tokens from one or more senders.',\n icon: 'request',\n\n requirements: {\n secrets: [ 'ownerKey' ],\n variables: [ 'requestedTokenCategory', 'requestedTokenAmount' ],\n },\n },\n sender: {\n name: 'Send',\n description: 'Send a specific amount of fungible tokens to the provided receiver.',\n icon: 'send',\n\n // The sender only need to provide blockchain-level requirements.\n // NOTE: This field is not required when empty, but shown here for illustrative purposes.\n requirements: {},\n },\n },\n\n requirements: {\n roles: [\n {\n role: 'receiver',\n slots: { min: 1, max: 1 },\n },\n {\n role: 'sender',\n slots: { min: 1, max: undefined },\n },\n ],\n },\n\n transaction: 'requestFungibleTokensTransaction',\n },\n requestNonfungibleTokens: {\n // TODO: Consider rewriting to be generic/role-less.\n name: 'Request a Non-fungible Token',\n description: 'Requests a non-fungible token from one or more senders.',\n icon: 'request',\n\n roles: {\n receiver: {\n name: 'Request a Non-fungible Token',\n description: 'Requests a non-fungible token from one or more senders.',\n icon: 'request',\n\n requirements: {\n secrets: [ 'ownerKey' ],\n variables: [ 'requestedTokenCategory', 'requestedTokenCapability', 'requestedTokenCommitment' ],\n },\n },\n sender: {\n name: 'Send',\n description: 'Send a non-fungible token to the provided receiver.',\n icon: 'send',\n\n // The sender only need to provide blockchain-level requirements.\n // NOTE: This field is not required when empty, but shown here for illustrative purposes.\n requirements: {},\n },\n },\n\n requirements: {\n roles: [\n {\n role: 'receiver',\n slots: { min: 1, max: 1 },\n },\n {\n role: 'sender',\n slots: { min: 1, max: undefined },\n },\n ],\n },\n\n transaction: 'requestNonfungibleTokensTransaction',\n },\n\n // NOTE: Sending value can be done without explicit template support.\n // NOTE: This feature is explicitly defined in this template to demonstrate how versatile templates can be, and\n // to ensure the feature is discoverable by the user from outputs that hold value.\n sendSatoshis: {\n name: 'Send Satoshis',\n description: 'Sends a specific amount of Bitcoin Cash to a given recipient.',\n icon: 'send',\n\n roles: {\n sender: {\n requirements: {\n variables: [ 'transferredSatoshis', 'recipientLockingscript' ],\n secrets: [ 'ownerKey' ],\n },\n },\n },\n\n requirements: {\n roles: [\n {\n role: 'sender',\n slots: { min: 1, max: 1 },\n },\n ],\n },\n\n // Sending is only available for outputs that have sufficient satoshis on them.\n // NOTE: Dust is enforced here according to standardness rules.\n condition: '$(OP_INPUTINDEX OP_UTXOVALUE <dustLimit> OP_GREATERTHAN)',\n\n transaction: 'transferSatoshisTransaction',\n },\n sendFungibleTokens: {\n name: 'Send Fungible Tokens',\n description: 'Send a specific amount of a fungible token to a given recipient.',\n icon: 'send',\n\n roles: {\n sender: {\n requirements: {\n variables: [ 'transferredTokenCategory', 'transferredTokenAmount', 'recipientLockingscript' ],\n secrets: [ 'ownerKey' ],\n },\n },\n },\n\n requirements: {\n roles: [\n {\n role: 'sender',\n slots: { min: 1, max: 1 },\n },\n ],\n },\n\n // Sending is only available for outputs that have fungible tokens on them.\n condition: '$(OP_INPUTINDEX OP_UTXOTOKENAMOUNT <0> OP_GREATERTHAN)',\n\n transaction: 'transferFungibleTokensTransaction',\n },\n sendNonfungibleTokens: {\n name: 'Send a Non-fungible Token',\n description: 'Send a non-fungible token to a given recipient.',\n icon: 'send',\n\n roles: {\n sender: {\n requirements: {\n variables: [ 'transferredTokenCategory', 'transferredTokenCapability', 'transferredTokenCommitment', 'recipientLockingscript' ],\n secrets: [ 'ownerKey' ],\n },\n },\n },\n\n requirements: {\n roles: [\n {\n role: 'sender',\n slots: { min: 1, max: 1 },\n },\n ],\n },\n\n // Sending is only available for outputs that have a non-fungible token on them.\n condition: '$(OP_INPUTINDEX OP_UTXOTOKENCATEGORY OP_SIZE OP_NIP <32> OP_GREATERTHAN)',\n\n transaction: 'transferNonfungibleTokensTransaction',\n },\n\n // NOTE: Burning tokens can be done without explicit template support.\n // NOTE: This feature is explicitly defined in this template to demonstrate how versatile templates can be, and\n // to ensure the feature is discoverable by the user from outputs that hold tokens.\n burnFungibleTokens: {\n name: 'Delete Fungible Tokens',\n description: 'Permanently and irreversibly deletes one or more fungible tokens.',\n icon: 'burn',\n\n roles: {\n owner: {\n requirements: {\n variables: [ 'burnedTokenCategory', 'burnedTokenAmount' ],\n secrets: [ 'ownerKey' ],\n },\n },\n },\n\n requirements: {\n roles: [\n {\n role: 'owner',\n slots: { min: 1, max: 1 },\n },\n ],\n },\n\n // Burning is only available for outputs that have fungible tokens on them.\n condition: '$(OP_INPUTINDEX OP_UTXOTOKENAMOUNT <0> OP_GREATERTHAN)',\n\n transaction: 'burnFungibleTokensTransaction',\n },\n burnNonfungibleTokens: {\n name: 'Delete a Non-fungible Token',\n description: 'Permanently and irreversibly deletes one non-fungible token.',\n icon: 'burn',\n\n roles: {\n owner: {\n requirements: {\n variables: [ 'burnedTokenCategory', 'burnedTokenCapability', 'burnedTokenCommitment' ],\n secrets: [ 'ownerKey' ],\n },\n },\n },\n\n requirements: {\n roles: [\n {\n role: 'owner',\n slots: { min: 1, max: 1 },\n },\n ],\n },\n\n // Burning is only available for outputs that have non-fungible tokens on them.\n condition: '$(OP_INPUTINDEX OP_UTXOTOKENCATEGORY OP_SIZE OP_NIP <32> OP_GREATERTHAN)',\n\n transaction: 'burnNonfungibleTokenTransaction',\n },\n\n sign: {\n name: 'Sign Message',\n description: 'Signs a provided message using the Bitcoin message signing protocol.',\n icon: 'sign',\n\n roles: {\n owner: {\n requirements: {\n variables: [ 'messageToSign' ],\n secrets: [ 'ownerKey' ],\n },\n },\n },\n\n requirements: {\n roles: [\n {\n role: 'owner',\n slots: { min: 1, max: 1 },\n },\n ],\n },\n\n data: [ 'messageSignature' ],\n },\n verify: {\n name: 'Verify Message Signature',\n description: 'Verifies a provided message signature according to the Bitcoin message signing protocol.',\n icon: 'verify',\n\n roles: {\n owner: {\n requirements: {\n variables: [ 'messageSignature', 'messageToVerify' ],\n secrets: [ 'ownerKey' ],\n },\n },\n },\n\n requirements: {\n roles: [\n {\n role: 'owner',\n slots: { min: 1, max: 1 },\n },\n ],\n },\n\n data: [ 'messageSignatureValidity' ],\n },\n },\n\n // Define a set of data that can be used in this template.\n data: {\n messageSignature: {\n // Evaluate CashASM expression to get the signature needed.\n // NOTE: Pushes the prefix and message, then concatenates them together to form the data to sign.\n // NOTE: In libauth today, it seems that this is done by defining the signature as a variable, and tying it to the key and message,\n // and so this is different\n // TODO: Check with Jason and see if there is any reason why this cannot be done like this.\n value: '$(<messagePrefix> <message> OP_CAT <ownerKey.data_signature.top_stack_element>)',\n type: 'bytes',\n hint: 'signature',\n },\n messageSignatureValidity: {\n // Evaluate the validity of the message with the owners public key.\n value: '$(<messageSignature> <messagePrefix> <message> OP_CAT <ownerKey.public_key> OP_CHECKDATASIG)',\n type: 'integer',\n hint: 'script_boolean',\n },\n },\n\n // Define a set of transactions that can be used in this template.\n transactions: {\n receiveTransaction: {\n name: 'Transfer Completed',\n description: 'Transferred an unspecified amount of cash and/or tokens.',\n icon: 'request',\n\n roles: {\n receiver: {\n name: 'Received',\n description: 'Received an unspecified amount of cash and/or tokens.',\n icon: 'receive',\n },\n sender: {\n name: 'Sent',\n description: 'Sent an unspecified amount of cash and/or tokens.',\n icon: 'send',\n },\n },\n\n // Inputs and outputs that must exist in the transaction.\n // NOTE: There is no inputs required, but the engine should detect that there is not sufficient input value to\n // match the output and thus generate an invitation to participate in this action.\n // When the invitation is shared, the other parties can add as many inputs and change outputs as needed.\n inputs: [],\n outputs: [\n {\n output: 'receiveOutput',\n index: undefined,\n },\n ],\n\n // Standard transaction without a locktime.\n version: 2,\n locktime: 0,\n\n // ...\n composable: true,\n },\n requestSatoshisTransaction: {\n name: 'Satoshis Transferred',\n description: 'Transferred $(<requestedSatoshis>) satoshis.',\n icon: 'request',\n\n roles: {\n receiver: {\n name: 'Received',\n description: 'Received $(<requestedSatoshis>) satoshis.',\n icon: 'receive',\n },\n sender: {\n name: 'Sent',\n description: 'Sent $(<requestedSatoshis>) satoshis.',\n icon: 'send',\n },\n },\n\n // Inputs and outputs that must exist in the transaction.\n // NOTE: There is no inputs required, but the engine should detect that there is not sufficient input value to\n // match the output and thus generate an invitation to participate in this action.\n // When the invitation is shared, the other party can add as many inputs and outputs as needed since this transaction is composable.\n inputs: [],\n outputs: [\n {\n output: 'requestSatoshisOutput',\n index: undefined,\n },\n ],\n\n // Standard transaction without a locktime.\n version: 2,\n locktime: 0,\n\n // ...\n composable: true,\n },\n requestFungibleTokensTransaction: {\n name: 'Fungible Tokens Transferred',\n description:\n 'Transferred $(<requestedTokenAmount> <requestedTokenCategory.decimalsFactor> OP_DIV).$(<requestedTokenAmount> <requestedTokenCategory.decimalsFactor> OP_MOD) $(<requestedTokenCategory.symbol>) tokens.',\n icon: 'request',\n\n roles: {\n receiver: {\n name: 'Received',\n description:\n 'Received $(<requestedTokenAmount> <requestedTokenCategory.decimalsFactor> OP_DIV).$(<requestedTokenAmount> <requestedTokenCategory.decimalsFactor> OP_MOD) $(<requestedTokenCategory.symbol>) tokens.',\n icon: 'receive',\n },\n sender: {\n name: 'Sent',\n description:\n 'Sent $(<requestedTokenAmount> <requestedTokenCategory.decimalsFactor> OP_DIV).$(<requestedTokenAmount> <requestedTokenCategory.decimalsFactor> OP_MOD) $(<requestedTokenCategory.symbol>) tokens.',\n icon: 'send',\n },\n },\n\n // Inputs and outputs that must exist in the transaction.\n // NOTE: There is no inputs required, but the engine should detect that there is not sufficient input value to\n // match the output and thus generate an invitation to participate in this action.\n // When the invitation is shared, the other party can add as many inputs and outputs as needed since this transaction is composable.\n inputs: [],\n outputs: [\n {\n output: 'requestFungibleTokensOutput',\n index: undefined,\n },\n ],\n\n // Standard transaction without a locktime.\n version: 2,\n locktime: 0,\n\n // ...\n composable: true,\n },\n requestNonfungibleTokensTransaction: {\n name: 'Non-Fungible Token Transferred',\n description:\n 'Transferred one non-fungible $(<requestedTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <requestedTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) (<requestedTokenCategory.symbol>) token, with $(<requestedTokenCommitment>) commitment.',\n icon: 'request',\n\n roles: {\n receiver: {\n name: 'Received',\n description:\n 'Received one non-fungible $(<requestedTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <requestedTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) (<requestedTokenCategory.symbol>) token, with $(<requestedTokenCommitment>) commitment.',\n icon: 'receive',\n },\n sender: {\n name: 'Sent',\n description:\n 'Sent the requested non-fungible $(<requestedTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <requestedTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) (<requestedTokenCategory.symbol>) token, with $(<requestedTokenCommitment>) commitment.',\n icon: 'send',\n },\n },\n\n // Inputs and outputs that must exist in the transaction.\n // NOTE: There is no inputs required, but the engine should detect that there is not sufficient input value to\n // match the output and thus generate an invitation to participate in this action.\n // When the invitation is shared, the other party can add as many inputs and outputs as needed since this transaction is composable.\n inputs: [],\n outputs: [\n {\n output: 'requestNonfungibleTokensOutput',\n index: undefined,\n },\n ],\n\n // Standard transaction without a locktime.\n version: 2,\n locktime: 0,\n\n // ...\n composable: true,\n },\n\n transferSatoshisTransaction: {\n name: 'Satoshis Transferred',\n description: '$(<transferredSatoshis>) satoshis were transferred to a recipient.',\n icon: 'send',\n\n roles: {\n receiver: {\n name: 'Received',\n description: 'Received $(<transferredSatoshis>) satoshis.',\n icon: 'receive',\n },\n sender: {\n name: 'Sent',\n description: 'Sent $(<transferredSatoshis>) satoshis.',\n icon: 'send',\n },\n },\n\n // Enforce the inputs and outputs required by the transaction.\n // NOTE: The input is provided from the action since it is only available on outputs with satoshis.\n inputs: [],\n outputs: [\n {\n output: 'transferSatoshisOutput',\n index: undefined,\n },\n ],\n\n // Standard transaction without a locktime.\n version: 2,\n locktime: 0,\n\n // ...\n composable: true,\n },\n transferFungibleTokensTransaction: {\n name: 'Fungible Tokens Transferred',\n description:\n '$(<transferredTokenAmount> <transferredTokenCategory.decimalsFactor> OP_DIV).$(<transferredTokenAmount> <transferredTokenCategory.decimalsFactor> OP_MOD) $(<transferredTokenCategory.symbol>) tokens were transferred to a recipient.',\n icon: 'send',\n\n roles: {\n receiver: {\n name: 'Received',\n description:\n 'Received $(<transferredTokenAmount> <transferredTokenCategory.decimalsFactor> OP_DIV).$(<transferredTokenAmount> <transferredTokenCategory.decimalsFactor> OP_MOD) $(<transferredTokenCategory.symbol>) tokens.',\n icon: 'receive',\n },\n sender: {\n name: 'Sent',\n description:\n 'Sent $(<transferredTokenAmount> <transferredTokenCategory.decimalsFactor> OP_DIV).$(<transferredTokenAmount> <transferredTokenCategory.decimalsFactor> OP_MOD) $(<transferredTokenCategory.symbol>) tokens.',\n icon: 'send',\n },\n },\n\n // Enforce the inputs and outputs required by the transaction.\n // NOTE: The input is provided from the action since it is only available on outputs with fungible tokens.\n inputs: [],\n outputs: [\n {\n output: 'transferFungibleTokensOutput',\n index: undefined,\n },\n ],\n\n // Standard transaction without a locktime.\n version: 2,\n locktime: 0,\n\n // ...\n composable: true,\n },\n transferNonfungibleTokensTransaction: {\n name: 'Non-fungible Token Transferred',\n description:\n 'One non-fungible $(<transferredTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <transferredTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) $(<transferredTokenCategory.symbol>) token was transferred to a recipient, with $(<transferredTokenCommitment>) commitment.',\n icon: 'send',\n\n roles: {\n receiver: {\n name: 'Received',\n description:\n 'Received one non-fungible $(<transferredTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <transferredTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) (<transferredTokenCategory.symbol>) token, with $(<transferredTokenCommitment>) commitment.',\n icon: 'receive',\n },\n sender: {\n name: 'Sent',\n description:\n 'Sent one non-fungible $(<transferredTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <transferredTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) (<transferredTokenCategory.symbol>) token, with $(<transferredTokenCommitment>) commitment.',\n icon: 'send',\n },\n },\n\n // Enforce the inputs and outputs required by the transaction.\n // NOTE: The input is provided from the action since it is only available on outputs with a non-fungible token.\n inputs: [],\n outputs: [\n {\n output: 'transferNonfungibleTokenOutput',\n index: undefined,\n },\n ],\n\n // Standard transaction without a locktime.\n version: 2,\n locktime: 0,\n\n // ...\n composable: true,\n },\n\n burnFungibleTokensTransaction: {\n name: 'Deleted fungible tokens',\n description:\n 'Permanently and irreversibly deleted $(<burnedTokenAmount> <burnedTokenCategory.decimalsFactor> OP_DIV).$(<burnedTokenAmount> <burnedTokenCategory.decimalsFactor> OP_MOD) $(<burnedTokenCategory.symbol>) tokens.',\n icon: 'burn',\n\n // Inputs and outputs that must exist in the transaction.\n // NOTE: There is no defined outputs as any non-burned value is automatically returned as change.\n inputs: [\n {\n input: 'burnFungibleTokensInput',\n index: undefined,\n },\n ],\n\n outputs: [],\n\n // Standard transaction without a locktime.\n version: 2,\n locktime: 0,\n\n // ...\n composable: true,\n },\n burnNonfungibleTokenTransaction: {\n name: 'Deleted non fungible token',\n description:\n 'Permanently and irreversibly deleted a non-fungible $(<burnedTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <burnedTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) (<burnedTokenCategory.symbol>) token, with $(<burnedTokenCommitment>) commitment.',\n icon: 'burn',\n\n // Inputs and outputs that must exist in the transaction.\n // NOTE: There is no defined outputs as any non-burned value is automatically returned as change.\n inputs: [\n {\n input: 'burnNonfungibleTokenInput',\n index: undefined,\n },\n ],\n outputs: [],\n\n // Standard transaction without a locktime.\n version: 2,\n locktime: 0,\n\n // ...\n composable: true,\n },\n },\n\n // Define a set of outputs that can be used within transactions in this template.\n outputs: {\n changeOutput: {\n name: 'Change',\n description: 'Funds returned as change.',\n icon: 'receive',\n\n // Defines how the requested funds should be locked.\n lockscript: 'receivingLockingScript',\n },\n receiveOutput: {\n name: 'Recipient output',\n description: 'Transferred an unspecified amount of cash and/or tokens to a recipient.',\n icon: 'receive',\n\n roles: {\n receiver: {\n name: 'Received',\n description: 'Received an unspecified amount of cash and/or tokens.',\n },\n sender: {\n name: 'Sent',\n description: 'Sent an unspecified amount of cash and/or tokens.',\n },\n },\n\n // Defines how the requested funds should be locked.\n lockscript: 'receivingLockingScript',\n },\n requestSatoshisOutput: {\n name: 'Satoshis',\n description: '$(<requestedSatoshis>) satoshis.',\n icon: 'request',\n\n roles: {\n receiver: {\n name: 'Satoshis Received',\n description: 'Received $(<requestedSatoshis>) satoshis.',\n },\n sender: {\n name: 'Satoshis Sent',\n description: 'Sent $(<requestedSatoshis>) satoshis.',\n },\n },\n\n // Defines how the requested funds should be locked.\n lockscript: 'receivingLockingScript',\n\n // Require the specified number of satoshis and no tokens.\n valueSatoshis: '$(<requestedSatoshis>)',\n token: null,\n },\n requestFungibleTokensOutput: {\n name: 'Fungible $(<requestedTokenCategory.symbol>) Tokens',\n description:\n '$(<requestedTokenAmount> <requestedTokenCategory.decimalsFactor> OP_DIV).$(<requestedTokenAmount> <requestedTokenCategory.decimalsFactor> OP_MOD) $(<requestedTokenCategory.symbol>) tokens.',\n icon: 'request',\n\n roles: {\n receiver: {\n name: 'Fungible $(<requestedTokenCategory.symbol>) Tokens Received',\n description:\n 'Received $(<requestedTokenAmount> <requestedTokenCategory.decimalsFactor> OP_DIV).$(<requestedTokenAmount> <requestedTokenCategory.decimalsFactor> OP_MOD) $(<requestedTokenCategory.symbol>) tokens.',\n },\n sender: {\n name: 'Fungible $(<requestedTokenCategory.symbol>) Tokens Sent',\n description:\n 'Sent $(<requestedTokenAmount> <requestedTokenCategory.decimalsFactor> OP_DIV).$(<requestedTokenAmount> <requestedTokenCategory.decimalsFactor> OP_MOD) $(<requestedTokenCategory.symbol>) tokens.',\n },\n },\n\n // Defines how the requested funds should be locked.\n lockscript: 'receivingLockingScript',\n\n // Require a flat 1000 satoshis to ensure the fungible tokens remains transferrable.\n valueSatoshis: '1000',\n\n // Require only the specified amount and type of fungible tokens.\n // NOTE: This can be composed with a request for a non-fungible token, but will always result in two separate outputs.\n token: {\n category: '$(<requestedTokenCategory>)',\n amount: '$(<requestedTokenAmount>)',\n nft: null,\n },\n },\n requestNonfungibleTokensOutput: {\n name: 'Non-fungible $(<requestedTokenCategory.symbol>) Token',\n description:\n 'Transferred one non-fungible $(<requestedTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <requestedTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) $(<requestedTokenCategory.symbol>) token to a recipient, with $(<requestedTokenCommitment>) commitment.',\n icon: 'request',\n\n roles: {\n receiver: {\n name: 'Non-fungible $(<requestedTokenCategory.symbol>) Token Received',\n description:\n 'Received one non-fungible $(<requestedTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <requestedTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) $(<requestedTokenCategory.symbol>) token, with $(<requestedTokenCommitment>) commitment.',\n },\n sender: {\n name: 'Non-fungible $(<requestedTokenCategory.symbol>) Token Sent',\n description:\n 'Sent the requested non-fungible $(<requestedTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <requestedTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) $(<requestedTokenCategory.symbol>) token, with $(<requestedTokenCommitment>) commitment.',\n },\n },\n\n // Defines how the requested funds should be locked.\n lockscript: 'receivingLockingScript',\n\n // Require a flat 1000 satoshis to ensure the non-fungible token remains transferrable.\n valueSatoshis: '1000',\n\n // Require only an NFT with specified category, capability and commitment.\n // NOTE: This can be composed with a request for fungible token amounts, but will always result in two separate outputs.\n token: {\n category: '$(<requestedTokenCategory>)',\n amount: null,\n nft: {\n capability: '$(<requestedTokenCapability>)',\n commitment: '$(<requestedTokenCommitment>)',\n },\n },\n },\n\n transferSatoshisOutput: {\n name: 'Recipient output',\n description: 'Transferred $(<transferredSatoshis>) satoshis to a recipient.',\n icon: 'send',\n\n roles: {\n receiver: {\n name: 'Received',\n description: 'Received $(<transferredSatoshis>) satoshis.',\n },\n sender: {\n name: 'Sent',\n description: 'Sent $(<transferredSatoshis>) satoshis.',\n },\n },\n\n // Use the recipients lockscript.\n lockscript: 'sendingLockingscript',\n\n // Set the amount of satoshis to transfer.\n valueSatoshis: '$(<transferredSatoshis>)',\n },\n transferFungibleTokensOutput: {\n name: 'Recipient output',\n description:\n 'Transferred $(<transferredTokenAmount> <transferredTokenCategory.decimalsFactor> OP_DIV).$(<transferredTokenAmount> <transferredTokenCategory.decimalsFactor> OP_MOD) $(<transferredTokenCategory.symbol>) tokens to a recipient.',\n icon: 'send',\n\n roles: {\n receiver: {\n name: 'Received',\n description:\n 'Received $(<transferredTokenAmount> <transferredTokenCategory.decimalsFactor> OP_DIV).$(<transferredTokenAmount> <transferredTokenCategory.decimalsFactor> OP_MOD) $(<transferredTokenCategory.symbol>) tokens.',\n },\n sender: {\n name: 'Sent',\n description:\n 'Sent $(<transferredTokenAmount> <transferredTokenCategory.decimalsFactor> OP_DIV).$(<transferredTokenAmount> <transferredTokenCategory.decimalsFactor> OP_MOD) $(<transferredTokenCategory.symbol>) tokens.',\n },\n },\n\n // Use the recipients lockscript.\n lockscript: 'sendingLockingscript',\n\n // Set the amount of fungible tokens to transfer.\n token: {\n category: '$(<transferredTokenCategory>)',\n amount: '$(<transferredTokenAmount>)',\n },\n },\n transferNonfungibleTokenOutput: {\n name: 'Recipient output',\n description:\n 'Transferred one non-fungible $(<transferredTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <transferredTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) $(<transferredTokenCategory.symbol>) token to a recipient, with $(<transferredTokenCommitment>) commitment.',\n icon: 'send',\n\n roles: {\n receiver: {\n name: 'Received',\n description:\n 'Received one non-fungible $(<transferredTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <transferredTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) $(<transferredTokenCategory.symbol>) token, with $(<transferredTokenCommitment>) commitment.',\n },\n sender: {\n name: 'Sent',\n description:\n 'Sent one non-fungible $(<transferredTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <transferredTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) $(<transferredTokenCategory.symbol>) token, with $(<transferredTokenCommitment>) commitment.',\n },\n },\n\n // Use the recipients lockscript.\n lockscript: 'sendingLockingscript',\n\n // Set the non-fungible token to transfer.\n token: {\n category: '$(<transferredTokenCategory>)',\n nft: {\n capability: '$(<transferredTokenCapability>)',\n commitment: '$(<transferredTokenCommitment>)',\n },\n },\n },\n },\n\n inputs: {\n burnFungibleTokensInput: {\n name: 'Deleted fungible tokens',\n description: 'Permanently and irreversibly deleted $(<burnedTokenAmount>) $(<burnedTokenCategory>).',\n icon: 'burn',\n\n // Define which unlocking script unlocks this input.\n unlockingScript: 'unlockP2PKH',\n\n // Require a fungible token of the requested token category, with an amount larger than or equal to the requested amount to burn.\n token: {\n category: '$(<burnedTokenCategory>)',\n amount: '$(<this.fungibleTokenAmount> <burnedTokenAmount> OP_GREATERTHANOREQUAL OP_IF <this.fungibleTokens> OP_ENDIF)',\n },\n\n // Ignore the burned token amount when determining change for this output.\n // NOTE: The engine must check that this does not exceed the input value.\n omitChangeAmounts: {\n fungibleTokens: '${<burnedTokenAmount>}',\n },\n },\n burnNonfungibleTokenInput: {\n name: 'Deleted non-fungible token',\n description:\n 'Permanently and irreversibly burned one non-fungible $(<burnedTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <burnedTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) token of category $(<burnedTokenCategory>), with a $(<burnedTokenCommitment>) commitment.',\n icon: 'burn',\n\n // Define which unlocking script unlocks this input.\n unlockingScript: 'unlockP2PKH',\n\n // Require a non-fungible token of the specified category, capability and commitment to burn.\n token: {\n category: '$(<burnedTokenCategory>)',\n nft: {\n capability: '$(<burnedTokenCapability>)',\n commitment: '$(<burnedTokenCommitment>)',\n },\n },\n\n // Ignore the burned token when determining change for this output.\n // NOTE: The engine must check that this does not exceed the input value.\n omitChangeAmounts: {\n nonfungibleTokens: 1,\n },\n },\n },\n\n // Define locking scripts used by this template.\n // NOTE: Template supported wallets should automatically track all generated lockscripts for on-chain events.\n lockingScripts: {\n sendingLockingscript: {\n // TODO: This currently describes outputs locked to this script, but all actions creating such outputs already have descriptions.\n // This can either be dropped, or maybe more importantly, should be disambiguated so that lockscripts can provide separate\n // descriptions for their script and the outputs that are locked to them. Leaving as a TODO for now and will address later.\n name: 'Sent',\n description: 'Funds sent to an external recipient',\n icon: 'address',\n\n // ...\n lockingType: 'standard',\n lockingScript: 'lockToRecipient',\n\n // Indicate that the sent output does not belong to the initiating user.\n // NOTE: These values default to false/empty, but added here for additional clarity.\n actions: [],\n state: [],\n secrets: [],\n balance: false,\n selectable: false,\n privacy: false,\n },\n receivingLockingScript: {\n // NOTE: Outputs to this lockscript by external actors defaults to this description when detected on-chain.\n name: 'Received',\n description: 'Funds received without wallet coordination.',\n icon: 'address',\n\n // Defines how spending future received funds should be locked.\n lockingType: 'standard',\n lockingScript: 'lockP2PKH',\n\n // Define a default unlocking script to be used when no action provided script is present.\n unlockingScript: 'unlockP2PKH',\n\n // Participants without a role or observers cannot take any further actions.\n // NOTE: This is not required but shown here for illustrative purposes.\n actions: [],\n\n roles: {\n receiver: {\n // The only state that is required to be persisted when receiving funds is the owners private key.\n // NOTE: This is defined as a secret to not leak when creating invitations for others to participate in request or send actions.\n state: {\n variables: [],\n secrets: [ 'ownerKey' ],\n },\n\n // List actions that can be taken with the ownerKey for each address/lockscript.\n actions: [\n {\n action: 'sign',\n role: 'owner',\n secrets: [ 'ownerKey' ],\n },\n {\n action: 'verify',\n role: 'owner',\n secrets: [ 'ownerKey' ],\n },\n {\n action: 'sendSatoshis',\n role: 'sender',\n secrets: [ 'ownerKey' ],\n },\n {\n action: 'sendFungibleTokens',\n role: 'sender',\n secrets: [ 'ownerKey' ],\n },\n {\n action: 'sendNonfungibleTokens',\n role: 'sender',\n secrets: [ 'ownerKey' ],\n },\n {\n action: 'burnFungibleTokens',\n role: 'sender',\n secrets: [ 'ownerKey' ],\n },\n {\n action: 'burnNonfungibleTokens',\n role: 'sender',\n secrets: [ 'ownerKey' ],\n },\n ],\n\n // Indicates how much of received funds should be part of a wallets total balance.\n // NOTE: Evaluates in the context of the source transaction, with the current outputs technical data available under this.output.*\n // NOTE: This can either evaluate to a boolean or a number. If evaluated to a boolean, then true means 100% of the output.\n // NOTE: Since we know that the owner controls all assets, we short-cut the evaluations by setting true directly.\n balance: {\n satoshis: true,\n fungibleTokens: true,\n // nonFungibleToken: true,\n },\n\n // Indicate when received funds should be considered in automatic coin selection to meet input requirements of other transactions.\n // NOTE: Evaluates in the context of the source transaction, with the current outputs technical data available under this.output.*\n // NOTE: This evaluates to a boolean. If non-true, the output should not be considered for automatic coin selection.\n // NOTE: Since we know that the secret key exist for the owner, this template short-cuts the evaluation by setting true directly.\n selectable: true,\n\n // Indicate that received funds are not considered good privacy.\n // NOTE: This information allows wallets to make better privacy decisions, like avoid mixing private and non-private outputs.\n privacy: false,\n },\n },\n },\n },\n\n // Define a set of scripts that can be used in this template.\n scripts: {\n lockP2PKH: 'OP_DUP OP_HASH160 <$(<ownerKey.public_key> OP_HASH160)> OP_EQUALVERIFY OP_CHECKSIG',\n unlockP2PKH: '<ownerKey.schnorr_signature.all_outputs> <ownerKey.public_key>',\n lockToRecipient: '<recipientLockingscript>',\n },\n\n // TODO: Add icons\n constants: {\n dustLimit: {\n name: 'Dust Limit',\n description: 'Standard required minimum satoshis for Pay to Public Key Hash outputs.',\n type: 'integer',\n value: 546,\n },\n\n // Define a message prefix for use in arbitrary message signing.\n messagePrefix: {\n name: 'Message Prefix',\n description: 'Standard message prefix used in the bitcoin signed message protocol.',\n type: 'bytes',\n\n // Value is enforced to the bitcoin signing magic string:\n // \"\\x18Bitcoin Signed Message:\\n\"\n value: '0x18426974636f696e205369676e6564204d6573736167653a0a',\n },\n },\n\n // TODO: Add icons\n variables: {\n // Describe the secret private key.\n ownerKey: {\n name: 'Owners Private Key',\n description: 'The private key used to authorize spending of received funds.',\n type: 'bytes',\n hint: 'private_key',\n },\n\n messageToSign: {\n name: 'Message',\n description: 'The text message to sign.',\n type: 'string',\n },\n messageToVerify: {\n name: 'Message',\n description: 'The text message to verify.',\n type: 'string',\n },\n messageSignature: {\n name: 'Message Signature',\n description: 'The signature for the message.',\n type: 'bytes',\n hint: 'signature',\n },\n\n // Describe the parameters used when requesting value.\n requestedSatoshis: {\n name: 'Requested Amount',\n description: 'The Bitcoin Cash amount requested',\n type: 'integer',\n hint: 'satoshis',\n },\n requestedTokenCategory: {\n name: 'Requested Token Category',\n description: 'The token category requested',\n type: 'bytes',\n hint: 'token_category',\n },\n requestedTokenAmount: {\n name: 'Requested Token Amount',\n description: 'The fungible token amount requested',\n type: 'integer',\n hint: 'token_amount',\n },\n requestedTokenCapability: {\n name: 'Requested Token Capability',\n description: 'The non-fungible token capability requested',\n type: 'bytes',\n hint: 'token_capability',\n },\n requestedTokenCommitment: {\n name: 'Requested Token Commitment',\n description: 'The non-fungible token commitment requested',\n type: 'bytes',\n hint: 'token_commitment',\n },\n transferredTokenCategory: {\n name: 'Sending Token Category',\n description: 'The token category of the token(s) to send',\n type: 'bytes',\n hint: 'token_category',\n },\n transferredTokenAmount: {\n name: 'Sending Token Amount',\n description: 'The fungible token amount to send',\n type: 'integer',\n hint: 'token_amount',\n },\n transferredTokenCapability: {\n name: 'Sending Token Capability',\n description: 'The token capability for the non-fungible token to send',\n type: 'bytes',\n hint: 'token_capability',\n },\n transferredTokenCommitment: {\n name: 'Sending Token Commitment',\n description: 'The token commitment for the non-fungible token to send',\n type: 'bytes',\n hint: 'token_commitment',\n },\n burnedTokenCategory: {\n name: 'Deleted Token Category',\n description: 'The token category of the token(s) to delete',\n type: 'bytes',\n hint: 'token_category',\n },\n burnedTokenAmount: {\n name: 'Deleted Token Amount',\n description: 'The fungible token amount to delete',\n type: 'integer',\n hint: 'token_amount',\n },\n burnedTokenCapability: {\n name: 'Deleted Token Capability',\n description: 'The token capability for the non-fungible token to delete',\n type: 'bytes',\n hint: 'token_capability',\n },\n burnedTokenCommitment: {\n name: 'Deleted Token Commitment',\n description: 'The token commitment for the non-fungible token to delete',\n type: 'bytes',\n hint: 'token_commitment',\n },\n },\n\n // Define a list of re-usable icons that can be used as part of metadata.\n // NOTE: the actual icons are not embedded in the template but only referenced by hashes here,\n // and can be distributed either as an asset pack or looked up through something like IPFS.\n icons: [\n {\n name: 'wallet',\n hash: '0000000000000000000000',\n },\n {\n name: 'owner',\n hash: '0000000000000000000000',\n },\n {\n name: 'sender',\n hash: '0000000000000000000000',\n },\n {\n name: 'address',\n hash: '0000000000000000000000',\n },\n {\n name: 'receive',\n hash: '0000000000000000000000',\n },\n {\n name: 'request',\n hash: '0000000000000000000000',\n },\n {\n name: 'send',\n hash: '0000000000000000000000',\n },\n {\n name: 'burn',\n hash: '0000000000000000000000',\n },\n {\n name: 'sign',\n hash: '0000000000000000000000',\n },\n {\n name: 'verify',\n hash: '0000000000000000000000',\n },\n ],\n\n scenarios: [\n {\n name: 'requesting satoshis',\n description: 'happy-path evaluation for requesting satoshis.',\n\n // The action being run in the scenario.\n action: 'requestSatoshis',\n\n // List of roles taken in this scenario, and the resources they provided.\n roles: [\n {\n role: 'receiver',\n values: {\n generated: {\n ownerKey: 'KyRQa5pEXuzVcDwnXRLpYAascjchQW5DoxVRMbj4DTxS83573mz8',\n },\n variables: {\n requestedSatoshis: 2000,\n },\n secrets: {\n // This scenario does not carry any secrets.\n },\n inputs: [],\n outputs: [\n {\n lockingBytecode: '76a91475c715ecb74178fe87933e57e947e5e92d904b8188ac',\n valueSatoshis: 2000,\n },\n ],\n },\n },\n {\n role: 'sender',\n values: {\n // The sender provides no raw data to the action.\n generated: {},\n variables: {},\n secrets: {},\n\n // The sender does provide input and change.\n inputs: [\n {\n outpointTransactionHash: '4ef28553a31a266719e66ba97fee3aeecd6d1788f7ff6ab12f8ebceda49660c0',\n outpointIndex: 0,\n sequenceNumber: 0,\n unlockingBytecode:\n '41226b2be7c2890c8bbde2f79e79640e56d866843f2e822ec51c469019d13db04a422c9ee49f5eefd26fee24e91910edbbb032b90cc54c34da80a61e69b0ee3d22412103e7ab26c36a7c7f45b2c26f33c08b0fa43a633268700f47216646d4cb37ae5696',\n },\n ],\n outputs: [\n {\n lockingBytecode: '76a91475c715ecb74178fe87933e57e947e5e92d904b8188ac',\n valueSatoshis: 2000,\n },\n ],\n },\n },\n ],\n\n // List of resources provided outside the context of a role.\n values: {\n generated: {\n // This scenario does not have any non-role generated values.\n },\n variables: {\n // This scenario does not have any non-role variables.\n },\n secrets: {\n // This scenario does not have any non-role secrets.\n },\n },\n\n // Outcomes provides the set of resulting values created from the action.\n outcome: {\n roles: {\n receiver: {\n name: 'Request',\n description: 'Requested a specific amount of satoshis from one or more senders.',\n icon: 'request',\n },\n sender: {\n name: 'Send',\n description: 'Sent a specific amount of satoshis to the provided receiver.',\n icon: 'send',\n },\n },\n\n transactions: [\n {\n transaction:\n '0200000001c06096a4edbc8e2fb16afff788176dcdee3aee7fa96be61967261aa35385f24e000000006441226b2be7c2890c8bbde2f79e79640e56d866843f2e822ec51c469019d13db04a422c9ee49f5eefd26fee24e91910edbbb032b90cc54c34da80a61e69b0ee3d22412103e7ab26c36a7c7f45b2c26f33c08b0fa43a633268700f47216646d4cb37ae5696000000000267530300000000001976a91475c715ecb74178fe87933e57e947e5e92d904b8188acd0070000000000001976a91475c715ecb74178fe87933e57e947e5e92d904b8188ac00000000',\n value: '',\n },\n ],\n },\n },\n ],\n};\n"],"mappings":"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AW;GACP,MAAM;GACN,aAAa;GACb,MAAM;GACN,OAAO;GACV;EAGD,eAAe;GACX,MAAM;GACN,aAAa;GACb,MAAM;GAIN,OAAO;GACV;EACJ;CAGD,WAAW;EAEP,UAAU;GACN,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EAED,eAAe;GACX,MAAM;GACN,aAAa;GACb,MAAM;GACT;EACD,iBAAiB;GACb,MAAM;GACN,aAAa;GACb,MAAM;GACT;EACD,kBAAkB;GACd,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EAGD,mBAAmB;GACf,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EACD,wBAAwB;GACpB,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EACD,sBAAsB;GAClB,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EACD,0BAA0B;GACtB,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EACD,0BAA0B;GACtB,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EACD,0BAA0B;GACtB,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EACD,wBAAwB;GACpB,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EACD,4BAA4B;GACxB,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EACD,4BAA4B;GACxB,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EACD,qBAAqB;GACjB,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EACD,mBAAmB;GACf,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EACD,uBAAuB;GACnB,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EACD,uBAAuB;GACnB,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EACJ;CAKD,OAAO;EACH;GACI,MAAM;GACN,MAAM;GACT;EACD;GACI,MAAM;GACN,MAAM;GACT;EACD;GACI,MAAM;GACN,MAAM;GACT;EACD;GACI,MAAM;GACN,MAAM;GACT;EACD;GACI,MAAM;GACN,MAAM;GACT;EACD;GACI,MAAM;GACN,MAAM;GACT;EACD;GACI,MAAM;GACN,MAAM;GACT;EACD;GACI,MAAM;GACN,MAAM;GACT;EACD;GACI,MAAM;GACN,MAAM;GACT;EACD;GACI,MAAM;GACN,MAAM;GACT;EACJ;CAED,WAAW,CACP;EACI,MAAM;EACN,aAAa;EAGb,QAAQ;EAGR,OAAO,CACH;GACI,MAAM;GACN,QAAQ;IACJ,WAAW,EACP,UAAU,wDACb;IACD,WAAW,EACP,mBAAmB,KACtB;IACD,SAAS,EAER;IACD,QAAQ,EAAE;IACV,SAAS,CACL;KACI,iBAAiB;KACjB,eAAe;KAClB,CACJ;IACJ;GACJ,EACD;GACI,MAAM;GACN,QAAQ;IAEJ,WAAW,EAAE;IACb,WAAW,EAAE;IACb,SAAS,EAAE;IAGX,QAAQ,CACJ;KACI,yBAAyB;KACzB,eAAe;KACf,gBAAgB;KAChB,mBACI;KACP,CACJ;IACD,SAAS,CACL;KACI,iBAAiB;KACjB,eAAe;KAClB,CACJ;IACJ;GACJ,CACJ;EAGD,QAAQ;GACJ,WAAW,EAEV;GACD,WAAW,EAEV;GACD,SAAS,EAER;GACJ;EAGD,SAAS;GACL,OAAO;IACH,UAAU;KACN,MAAM;KACN,aAAa;KACb,MAAM;KACT;IACD,QAAQ;KACJ,MAAM;KACN,aAAa;KACb,MAAM;KACT;IACJ;GAED,cAAc,CACV;IACI,aACI;IACJ,OAAO;IACV,CACJ;GACJ;EACJ,CACJ;CACJ"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../source/p2pkh.ts"],"sourcesContent":["import type { XOTemplate } from '@xo-cash/types';\n\nexport const p2pkhTemplate: XOTemplate = {\n $schema: 'https://libauth.org/schemas/wallet-template-v0.schema.json',\n\n // Name for this template.\n name: 'Wallet (P2PKH)',\n\n // Description for this template.\n description: 'A standard single-factor wallet template that uses Pay-to-Public-Key-Hash (P2PKH) locking scripts.',\n\n // Icon for this template.\n icon: 'wallet',\n\n // Version number for this template.\n version: '1',\n\n // List of VM versions that can be used to run this template.\n supported: [ 'BCH_2023_05', 'BCH_2024_05', 'BCH_2025_05', 'BCH_2026_05' ],\n\n // Sets optional default values to be used with this template.\n defaults: {\n // Configures a default intent structure for creating change outputs and locking scripts.\n // NOTE: This is used when the engine needs to make change for an output created by\n // this template and there is no other policy provided elsewhere that takes precedence.\n // NOTE: It is recommended that templates that create outputs with the 'selectable' property\n // either provides a change policy here, or a comment that explain that they\n // intentionally omit the change policy and why.\n change: {\n output: 'changeOutput',\n role: 'receiver',\n generate: [ 'ownerKey' ],\n },\n },\n\n // Describe a list of roles that are used in this template.\n // NOTE: Template roles are held only for the duration of one specific action/invitation.\n // For example, the same entity that acts as 'receiver' when creating/receiving an output\n // can later act as 'sender' (or 'owner') when performing a follow-up action.\n roles: {\n owner: {\n name: 'Wallet Owner',\n description: 'The party who can spend from this wallet.',\n icon: 'owner',\n },\n receiver: {\n name: 'Receiver',\n description: 'A party that is receiving value.',\n icon: 'receiver',\n },\n sender: {\n name: 'Sender',\n description: 'A party that is sending value.',\n icon: 'sender',\n },\n },\n\n // Define a list of entrypoints supported by this template.\n start: [\n {\n action: 'receive',\n role: 'receiver',\n generate: [ 'ownerKey' ],\n },\n {\n action: 'requestSatoshis',\n role: 'receiver',\n generate: [ 'ownerKey' ],\n },\n {\n action: 'requestFungibleTokens',\n role: 'receiver',\n generate: [ 'ownerKey' ],\n },\n {\n action: 'requestNonfungibleTokens',\n role: 'receiver',\n generate: [ 'ownerKey' ],\n },\n ],\n\n // Define a list of actions that can be taken by this template.\n // NOTE: There is no action to generate an address, but a wallet can create an invitation to a receive action and\n // extract the generated lockscript as needed as the engine will track all lockscripts it generates.\n actions: {\n receive: {\n // TODO: Consider rewriting to be generic/role-less.\n name: 'Receive',\n description: 'Receive an unspecified amount of cash and/or tokens from one or more senders.',\n icon: 'receive',\n\n roles: {\n receiver: {\n name: 'Receive',\n description: 'Receive an unspecified amount of cash and/or tokens from one or more senders.',\n icon: 'receive',\n\n requirements: {\n secrets: [ 'ownerKey' ],\n },\n },\n sender: {\n name: 'Send',\n description: 'Send an unspecified amount of cash and/or tokens to the provided receiver.',\n icon: 'send',\n\n // The sender only need to provide blockchain-level requirements.\n // NOTE: This field is not required when empty, but shown here for illustrative purposes.\n requirements: {},\n },\n },\n\n requirements: {\n participants: [\n {\n role: 'receiver',\n slots: { min: 1, max: 1 },\n },\n {\n role: 'sender',\n slots: { min: 1, max: undefined },\n },\n ],\n },\n\n transaction: 'receiveTransaction',\n },\n requestSatoshis: {\n // TODO: Consider rewriting to be generic/role-less.\n name: 'Request Satoshis',\n description: 'Requests a specific amount of Bitcoin Cash from one or more senders.',\n icon: 'request',\n\n roles: {\n receiver: {\n name: 'Request Satoshis',\n description: 'Requests a specific amount of Bitcoin Cash from one or more senders.',\n icon: 'request',\n\n requirements: {\n secrets: [ 'ownerKey' ],\n variables: [ 'requestedSatoshis' ],\n },\n },\n sender: {\n name: 'Send',\n description: 'Send a specific amount of Bitcoin Cash to the provided receiver.',\n icon: 'send',\n\n // The sender only need to provide blockchain-level requirements.\n // NOTE: This field is not required when empty, but shown here for illustrative purposes.\n requirements: {},\n },\n },\n\n requirements: {\n participants: [\n {\n role: 'receiver',\n slots: { min: 1, max: 1 },\n },\n {\n role: 'sender',\n slots: { min: 1, max: undefined },\n },\n ],\n },\n\n transaction: 'requestSatoshisTransaction',\n },\n requestFungibleTokens: {\n // TODO: Consider rewriting to be generic/role-less.\n name: 'Request Fungible Tokens',\n description: 'Requests a specific amount of a fungible tokens from one or more senders.',\n icon: 'request',\n\n roles: {\n receiver: {\n name: 'Request Fungible Tokens',\n description: 'Requests a specific amount of a fungible tokens from one or more senders.',\n icon: 'request',\n\n requirements: {\n secrets: [ 'ownerKey' ],\n variables: [ 'requestedTokenCategory', 'requestedTokenAmount' ],\n },\n },\n sender: {\n name: 'Send',\n description: 'Send a specific amount of fungible tokens to the provided receiver.',\n icon: 'send',\n\n // The sender only need to provide blockchain-level requirements.\n // NOTE: This field is not required when empty, but shown here for illustrative purposes.\n requirements: {},\n },\n },\n\n requirements: {\n participants: [\n {\n role: 'receiver',\n slots: { min: 1, max: 1 },\n },\n {\n role: 'sender',\n slots: { min: 1, max: undefined },\n },\n ],\n },\n\n transaction: 'requestFungibleTokensTransaction',\n },\n requestNonfungibleTokens: {\n // TODO: Consider rewriting to be generic/role-less.\n name: 'Request a Non-fungible Token',\n description: 'Requests a non-fungible token from one or more senders.',\n icon: 'request',\n\n roles: {\n receiver: {\n name: 'Request a Non-fungible Token',\n description: 'Requests a non-fungible token from one or more senders.',\n icon: 'request',\n\n requirements: {\n secrets: [ 'ownerKey' ],\n variables: [ 'requestedTokenCategory', 'requestedTokenCapability', 'requestedTokenCommitment' ],\n },\n },\n sender: {\n name: 'Send',\n description: 'Send a non-fungible token to the provided receiver.',\n icon: 'send',\n\n // The sender only need to provide blockchain-level requirements.\n // NOTE: This field is not required when empty, but shown here for illustrative purposes.\n requirements: {},\n },\n },\n\n requirements: {\n participants: [\n {\n role: 'receiver',\n slots: { min: 1, max: 1 },\n },\n {\n role: 'sender',\n slots: { min: 1, max: undefined },\n },\n ],\n },\n\n transaction: 'requestNonfungibleTokensTransaction',\n },\n\n // NOTE: Sending value can be done without explicit template support.\n // NOTE: This feature is explicitly defined in this template to demonstrate how versatile templates can be, and\n // to ensure the feature is discoverable by the user from outputs that hold value.\n sendSatoshis: {\n name: 'Send Satoshis',\n description: 'Sends a specific amount of Bitcoin Cash to a given recipient.',\n icon: 'send',\n\n roles: {\n sender: {\n requirements: {\n variables: [ 'transferredSatoshis', 'recipientLockingscript' ],\n secrets: [ 'ownerKey' ],\n },\n },\n },\n\n requirements: {\n participants: [\n {\n role: 'sender',\n slots: { min: 1, max: 1 },\n },\n ],\n },\n\n // Sending is only available for outputs that have sufficient satoshis on them.\n // NOTE: Dust is enforced here according to standardness rules.\n conditions: [ '$(OP_INPUTINDEX OP_UTXOVALUE <dustLimit> OP_GREATERTHAN)' ],\n\n transaction: 'transferSatoshisTransaction',\n },\n sendFungibleTokens: {\n name: 'Send Fungible Tokens',\n description: 'Send a specific amount of a fungible token to a given recipient.',\n icon: 'send',\n\n roles: {\n sender: {\n requirements: {\n variables: [ 'transferredTokenCategory', 'transferredTokenAmount', 'recipientLockingscript' ],\n secrets: [ 'ownerKey' ],\n },\n },\n },\n\n requirements: {\n participants: [\n {\n role: 'sender',\n slots: { min: 1, max: 1 },\n },\n ],\n },\n\n // Sending is only available for outputs that have fungible tokens on them.\n conditions: [ '$(OP_INPUTINDEX OP_UTXOTOKENAMOUNT <0> OP_GREATERTHAN)' ],\n\n transaction: 'transferFungibleTokensTransaction',\n },\n sendNonfungibleTokens: {\n name: 'Send a Non-fungible Token',\n description: 'Send a non-fungible token to a given recipient.',\n icon: 'send',\n\n roles: {\n sender: {\n requirements: {\n variables: [ 'transferredTokenCategory', 'transferredTokenCapability', 'transferredTokenCommitment', 'recipientLockingscript' ],\n secrets: [ 'ownerKey' ],\n },\n },\n },\n\n requirements: {\n participants: [\n {\n role: 'sender',\n slots: { min: 1, max: 1 },\n },\n ],\n },\n\n // Sending is only available for outputs that have a non-fungible token on them.\n conditions: [ '$(OP_INPUTINDEX OP_UTXOTOKENCATEGORY OP_SIZE OP_NIP <32> OP_GREATERTHAN)' ],\n\n transaction: 'transferNonfungibleTokensTransaction',\n },\n\n // NOTE: Burning tokens can be done without explicit template support.\n // NOTE: This feature is explicitly defined in this template to demonstrate how versatile templates can be, and\n // to ensure the feature is discoverable by the user from outputs that hold tokens.\n burnFungibleTokens: {\n name: 'Delete Fungible Tokens',\n description: 'Permanently and irreversibly deletes one or more fungible tokens.',\n icon: 'burn',\n\n roles: {\n owner: {\n requirements: {\n variables: [ 'burnedTokenCategory', 'burnedTokenAmount' ],\n secrets: [ 'ownerKey' ],\n },\n },\n },\n\n requirements: {\n participants: [\n {\n role: 'owner',\n slots: { min: 1, max: 1 },\n },\n ],\n },\n\n // Burning is only available for outputs that have fungible tokens on them.\n conditions: [ '$(OP_INPUTINDEX OP_UTXOTOKENAMOUNT <0> OP_GREATERTHAN)' ],\n\n transaction: 'burnFungibleTokensTransaction',\n },\n burnNonfungibleTokens: {\n name: 'Delete a Non-fungible Token',\n description: 'Permanently and irreversibly deletes one non-fungible token.',\n icon: 'burn',\n\n roles: {\n owner: {\n requirements: {\n variables: [ 'burnedTokenCategory', 'burnedTokenCapability', 'burnedTokenCommitment' ],\n secrets: [ 'ownerKey' ],\n },\n },\n },\n\n requirements: {\n participants: [\n {\n role: 'owner',\n slots: { min: 1, max: 1 },\n },\n ],\n },\n\n // Burning is only available for outputs that have non-fungible tokens on them.\n conditions: [ '$(OP_INPUTINDEX OP_UTXOTOKENCATEGORY OP_SIZE OP_NIP <32> OP_GREATERTHAN)' ],\n\n transaction: 'burnNonfungibleTokenTransaction',\n },\n\n sign: {\n name: 'Sign Message',\n description: 'Signs a provided message using the Bitcoin message signing protocol.',\n icon: 'sign',\n\n roles: {\n owner: {\n requirements: {\n variables: [ 'messageToSign' ],\n secrets: [ 'ownerKey' ],\n },\n },\n },\n\n requirements: {\n participants: [\n {\n role: 'owner',\n slots: { min: 1, max: 1 },\n },\n ],\n },\n\n data: 'messageSignature',\n },\n verify: {\n name: 'Verify Message Signature',\n description: 'Verifies a provided message signature according to the Bitcoin message signing protocol.',\n icon: 'verify',\n\n roles: {\n owner: {\n requirements: {\n variables: [ 'messageSignature', 'messageToVerify' ],\n secrets: [ 'ownerKey' ],\n },\n },\n },\n\n requirements: {\n participants: [\n {\n role: 'owner',\n slots: { min: 1, max: 1 },\n },\n ],\n },\n\n data: 'messageSignatureValidity',\n },\n },\n\n // Define a set of data that can be used in this template.\n data: {\n messageSignature: {\n // Evaluate CashASM expression to get the signature needed.\n // NOTE: Pushes the prefix and message, then concatenates them together to form the data to sign.\n // NOTE: In libauth today, it seems that this is done by defining the signature as a variable, and tying it to the key and message,\n // and so this is different\n // TODO: Check with Jason and see if there is any reason why this cannot be done like this.\n value: '$(<messagePrefix> <message> OP_CAT <ownerKey.data_signature.top_stack_element>)',\n type: 'bytes',\n hint: 'signature',\n },\n messageSignatureValidity: {\n // Evaluate the validity of the message with the owners public key.\n value: '$(<messageSignature> <messagePrefix> <message> OP_CAT <ownerKey.public_key> OP_CHECKDATASIG)',\n type: 'integer',\n hint: 'script_boolean',\n },\n },\n\n // Define a set of transactions that can be used in this template.\n transactions: {\n receiveTransaction: {\n name: 'Transfer Completed',\n description: 'Transferred an unspecified amount of cash and/or tokens.',\n icon: 'request',\n\n roles: {\n receiver: {\n name: 'Received',\n description: 'Received an unspecified amount of cash and/or tokens.',\n icon: 'receive',\n },\n sender: {\n name: 'Sent',\n description: 'Sent an unspecified amount of cash and/or tokens.',\n icon: 'send',\n },\n },\n\n // Inputs and outputs that must exist in the transaction.\n // NOTE: There is no inputs required, but the engine should detect that there is not sufficient input value to\n // match the output and thus generate an invitation to participate in this action.\n // When the invitation is shared, the other parties can add as many inputs and change outputs as needed.\n inputs: [],\n outputs: [\n {\n output: 'receiveOutput',\n outputIndex: undefined,\n },\n ],\n\n // Standard transaction without a locktime.\n version: 2,\n locktime: 0,\n\n // ...\n composable: true,\n },\n requestSatoshisTransaction: {\n name: 'Satoshis Transferred',\n description: 'Transferred $(<requestedSatoshis>) satoshis.',\n icon: 'request',\n\n roles: {\n receiver: {\n name: 'Received',\n description: 'Received $(<requestedSatoshis>) satoshis.',\n icon: 'receive',\n },\n sender: {\n name: 'Sent',\n description: 'Sent $(<requestedSatoshis>) satoshis.',\n icon: 'send',\n },\n },\n\n // Inputs and outputs that must exist in the transaction.\n // NOTE: There is no inputs required, but the engine should detect that there is not sufficient input value to\n // match the output and thus generate an invitation to participate in this action.\n // When the invitation is shared, the other party can add as many inputs and outputs as needed since this transaction is composable.\n inputs: [],\n outputs: [\n {\n output: 'requestSatoshisOutput',\n outputIndex: undefined,\n },\n ],\n\n // Standard transaction without a locktime.\n version: 2,\n locktime: 0,\n\n // ...\n composable: true,\n },\n requestFungibleTokensTransaction: {\n name: 'Fungible Tokens Transferred',\n description:\n 'Transferred $(<requestedTokenAmount> <requestedTokenCategory.decimalsFactor> OP_DIV).$(<requestedTokenAmount> <requestedTokenCategory.decimalsFactor> OP_MOD) $(<requestedTokenCategory.symbol>) tokens.',\n icon: 'request',\n\n roles: {\n receiver: {\n name: 'Received',\n description:\n 'Received $(<requestedTokenAmount> <requestedTokenCategory.decimalsFactor> OP_DIV).$(<requestedTokenAmount> <requestedTokenCategory.decimalsFactor> OP_MOD) $(<requestedTokenCategory.symbol>) tokens.',\n icon: 'receive',\n },\n sender: {\n name: 'Sent',\n description:\n 'Sent $(<requestedTokenAmount> <requestedTokenCategory.decimalsFactor> OP_DIV).$(<requestedTokenAmount> <requestedTokenCategory.decimalsFactor> OP_MOD) $(<requestedTokenCategory.symbol>) tokens.',\n icon: 'send',\n },\n },\n\n // Inputs and outputs that must exist in the transaction.\n // NOTE: There is no inputs required, but the engine should detect that there is not sufficient input value to\n // match the output and thus generate an invitation to participate in this action.\n // When the invitation is shared, the other party can add as many inputs and outputs as needed since this transaction is composable.\n inputs: [],\n outputs: [\n {\n output: 'requestFungibleTokensOutput',\n outputIndex: undefined,\n },\n ],\n\n // Standard transaction without a locktime.\n version: 2,\n locktime: 0,\n\n // ...\n composable: true,\n },\n requestNonfungibleTokensTransaction: {\n name: 'Non-Fungible Token Transferred',\n description:\n 'Transferred one non-fungible $(<requestedTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <requestedTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) (<requestedTokenCategory.symbol>) token, with $(<requestedTokenCommitment>) commitment.',\n icon: 'request',\n\n roles: {\n receiver: {\n name: 'Received',\n description:\n 'Received one non-fungible $(<requestedTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <requestedTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) (<requestedTokenCategory.symbol>) token, with $(<requestedTokenCommitment>) commitment.',\n icon: 'receive',\n },\n sender: {\n name: 'Sent',\n description:\n 'Sent the requested non-fungible $(<requestedTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <requestedTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) (<requestedTokenCategory.symbol>) token, with $(<requestedTokenCommitment>) commitment.',\n icon: 'send',\n },\n },\n\n // Inputs and outputs that must exist in the transaction.\n // NOTE: There is no inputs required, but the engine should detect that there is not sufficient input value to\n // match the output and thus generate an invitation to participate in this action.\n // When the invitation is shared, the other party can add as many inputs and outputs as needed since this transaction is composable.\n inputs: [],\n outputs: [\n {\n output: 'requestNonfungibleTokensOutput',\n outputIndex: undefined,\n },\n ],\n\n // Standard transaction without a locktime.\n version: 2,\n locktime: 0,\n\n // ...\n composable: true,\n },\n\n transferSatoshisTransaction: {\n name: 'Satoshis Transferred',\n description: '$(<transferredSatoshis>) satoshis were transferred to a recipient.',\n icon: 'send',\n\n roles: {\n receiver: {\n name: 'Received',\n description: 'Received $(<transferredSatoshis>) satoshis.',\n icon: 'receive',\n },\n sender: {\n name: 'Sent',\n description: 'Sent $(<transferredSatoshis>) satoshis.',\n icon: 'send',\n },\n },\n\n // Enforce the inputs and outputs required by the transaction.\n // NOTE: The input is provided from the action since it is only available on outputs with satoshis.\n inputs: [],\n outputs: [\n {\n output: 'transferSatoshisOutput',\n outputIndex: undefined,\n },\n ],\n\n // Standard transaction without a locktime.\n version: 2,\n locktime: 0,\n\n // ...\n composable: true,\n },\n transferFungibleTokensTransaction: {\n name: 'Fungible Tokens Transferred',\n description:\n '$(<transferredTokenAmount> <transferredTokenCategory.decimalsFactor> OP_DIV).$(<transferredTokenAmount> <transferredTokenCategory.decimalsFactor> OP_MOD) $(<transferredTokenCategory.symbol>) tokens were transferred to a recipient.',\n icon: 'send',\n\n roles: {\n receiver: {\n name: 'Received',\n description:\n 'Received $(<transferredTokenAmount> <transferredTokenCategory.decimalsFactor> OP_DIV).$(<transferredTokenAmount> <transferredTokenCategory.decimalsFactor> OP_MOD) $(<transferredTokenCategory.symbol>) tokens.',\n icon: 'receive',\n },\n sender: {\n name: 'Sent',\n description:\n 'Sent $(<transferredTokenAmount> <transferredTokenCategory.decimalsFactor> OP_DIV).$(<transferredTokenAmount> <transferredTokenCategory.decimalsFactor> OP_MOD) $(<transferredTokenCategory.symbol>) tokens.',\n icon: 'send',\n },\n },\n\n // Enforce the inputs and outputs required by the transaction.\n // NOTE: The input is provided from the action since it is only available on outputs with fungible tokens.\n inputs: [],\n outputs: [\n {\n output: 'transferFungibleTokensOutput',\n outputIndex: undefined,\n },\n ],\n\n // Standard transaction without a locktime.\n version: 2,\n locktime: 0,\n\n // ...\n composable: true,\n },\n transferNonfungibleTokensTransaction: {\n name: 'Non-fungible Token Transferred',\n description:\n 'One non-fungible $(<transferredTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <transferredTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) $(<transferredTokenCategory.symbol>) token was transferred to a recipient, with $(<transferredTokenCommitment>) commitment.',\n icon: 'send',\n\n roles: {\n receiver: {\n name: 'Received',\n description:\n 'Received one non-fungible $(<transferredTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <transferredTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) (<transferredTokenCategory.symbol>) token, with $(<transferredTokenCommitment>) commitment.',\n icon: 'receive',\n },\n sender: {\n name: 'Sent',\n description:\n 'Sent one non-fungible $(<transferredTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <transferredTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) (<transferredTokenCategory.symbol>) token, with $(<transferredTokenCommitment>) commitment.',\n icon: 'send',\n },\n },\n\n // Enforce the inputs and outputs required by the transaction.\n // NOTE: The input is provided from the action since it is only available on outputs with a non-fungible token.\n inputs: [],\n outputs: [\n {\n output: 'transferNonfungibleTokenOutput',\n outputIndex: undefined,\n },\n ],\n\n // Standard transaction without a locktime.\n version: 2,\n locktime: 0,\n\n // ...\n composable: true,\n },\n\n burnFungibleTokensTransaction: {\n name: 'Deleted fungible tokens',\n description:\n 'Permanently and irreversibly deleted $(<burnedTokenAmount> <burnedTokenCategory.decimalsFactor> OP_DIV).$(<burnedTokenAmount> <burnedTokenCategory.decimalsFactor> OP_MOD) $(<burnedTokenCategory.symbol>) tokens.',\n icon: 'burn',\n\n // Inputs and outputs that must exist in the transaction.\n // NOTE: There is no defined outputs as any non-burned value is automatically returned as change.\n inputs: [\n {\n input: 'burnFungibleTokensInput',\n inputIndex: undefined,\n },\n ],\n\n outputs: [],\n\n // Standard transaction without a locktime.\n version: 2,\n locktime: 0,\n\n // ...\n composable: true,\n },\n burnNonfungibleTokenTransaction: {\n name: 'Deleted non fungible token',\n description:\n 'Permanently and irreversibly deleted a non-fungible $(<burnedTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <burnedTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) (<burnedTokenCategory.symbol>) token, with $(<burnedTokenCommitment>) commitment.',\n icon: 'burn',\n\n // Inputs and outputs that must exist in the transaction.\n // NOTE: There is no defined outputs as any non-burned value is automatically returned as change.\n inputs: [\n {\n input: 'burnNonfungibleTokenInput',\n inputIndex: undefined,\n },\n ],\n outputs: [],\n\n // Standard transaction without a locktime.\n version: 2,\n locktime: 0,\n\n // ...\n composable: true,\n },\n },\n\n // Define a set of outputs that can be used within transactions in this template.\n outputs: {\n changeOutput: {\n name: 'Change',\n description: 'Funds returned as change.',\n icon: 'receive',\n\n // Defines how the requested funds should be locked.\n lockingScript: 'receivingLockingScript',\n },\n receiveOutput: {\n name: 'Recipient output',\n description: 'Transferred an unspecified amount of cash and/or tokens to a recipient.',\n icon: 'receive',\n\n roles: {\n receiver: {\n name: 'Received',\n description: 'Received an unspecified amount of cash and/or tokens.',\n },\n sender: {\n name: 'Sent',\n description: 'Sent an unspecified amount of cash and/or tokens.',\n },\n },\n\n // Defines how the requested funds should be locked.\n lockingScript: 'receivingLockingScript',\n },\n requestSatoshisOutput: {\n name: 'Satoshis',\n description: '$(<requestedSatoshis>) satoshis.',\n icon: 'request',\n\n roles: {\n receiver: {\n name: 'Satoshis Received',\n description: 'Received $(<requestedSatoshis>) satoshis.',\n },\n sender: {\n name: 'Satoshis Sent',\n description: 'Sent $(<requestedSatoshis>) satoshis.',\n },\n },\n\n // Defines how the requested funds should be locked.\n lockingScript: 'receivingLockingScript',\n\n // Require the specified number of satoshis and no tokens.\n valueSatoshis: '$(<requestedSatoshis>)',\n token: null,\n },\n requestFungibleTokensOutput: {\n name: 'Fungible $(<requestedTokenCategory.symbol>) Tokens',\n description:\n '$(<requestedTokenAmount> <requestedTokenCategory.decimalsFactor> OP_DIV).$(<requestedTokenAmount> <requestedTokenCategory.decimalsFactor> OP_MOD) $(<requestedTokenCategory.symbol>) tokens.',\n icon: 'request',\n\n roles: {\n receiver: {\n name: 'Fungible $(<requestedTokenCategory.symbol>) Tokens Received',\n description:\n 'Received $(<requestedTokenAmount> <requestedTokenCategory.decimalsFactor> OP_DIV).$(<requestedTokenAmount> <requestedTokenCategory.decimalsFactor> OP_MOD) $(<requestedTokenCategory.symbol>) tokens.',\n },\n sender: {\n name: 'Fungible $(<requestedTokenCategory.symbol>) Tokens Sent',\n description:\n 'Sent $(<requestedTokenAmount> <requestedTokenCategory.decimalsFactor> OP_DIV).$(<requestedTokenAmount> <requestedTokenCategory.decimalsFactor> OP_MOD) $(<requestedTokenCategory.symbol>) tokens.',\n },\n },\n\n // Defines how the requested funds should be locked.\n lockingScript: 'receivingLockingScript',\n\n // Require a flat 1000 satoshis to ensure the fungible tokens remains transferrable.\n valueSatoshis: '1000',\n\n // Require only the specified amount and type of fungible tokens.\n // NOTE: This can be composed with a request for a non-fungible token, but will always result in two separate outputs.\n token: {\n category: '$(<requestedTokenCategory>)',\n amount: '$(<requestedTokenAmount>)',\n nft: null,\n },\n },\n requestNonfungibleTokensOutput: {\n name: 'Non-fungible $(<requestedTokenCategory.symbol>) Token',\n description:\n 'Transferred one non-fungible $(<requestedTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <requestedTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) $(<requestedTokenCategory.symbol>) token to a recipient, with $(<requestedTokenCommitment>) commitment.',\n icon: 'request',\n\n roles: {\n receiver: {\n name: 'Non-fungible $(<requestedTokenCategory.symbol>) Token Received',\n description:\n 'Received one non-fungible $(<requestedTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <requestedTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) $(<requestedTokenCategory.symbol>) token, with $(<requestedTokenCommitment>) commitment.',\n },\n sender: {\n name: 'Non-fungible $(<requestedTokenCategory.symbol>) Token Sent',\n description:\n 'Sent the requested non-fungible $(<requestedTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <requestedTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) $(<requestedTokenCategory.symbol>) token, with $(<requestedTokenCommitment>) commitment.',\n },\n },\n\n // Defines how the requested funds should be locked.\n lockingScript: 'receivingLockingScript',\n\n // Require a flat 1000 satoshis to ensure the non-fungible token remains transferrable.\n valueSatoshis: '1000',\n\n // Require only an NFT with specified category, capability and commitment.\n // NOTE: This can be composed with a request for fungible token amounts, but will always result in two separate outputs.\n token: {\n category: '$(<requestedTokenCategory>)',\n amount: null,\n nft: {\n capability: '$(<requestedTokenCapability>)',\n commitment: '$(<requestedTokenCommitment>)',\n },\n },\n },\n\n transferSatoshisOutput: {\n name: 'Recipient output',\n description: 'Transferred $(<transferredSatoshis>) satoshis to a recipient.',\n icon: 'send',\n\n roles: {\n receiver: {\n name: 'Received',\n description: 'Received $(<transferredSatoshis>) satoshis.',\n },\n sender: {\n name: 'Sent',\n description: 'Sent $(<transferredSatoshis>) satoshis.',\n },\n },\n\n // Use the recipients lockscript.\n lockingScript: 'sendingLockingscript',\n\n // Set the amount of satoshis to transfer.\n valueSatoshis: '$(<transferredSatoshis>)',\n },\n transferFungibleTokensOutput: {\n name: 'Recipient output',\n description:\n 'Transferred $(<transferredTokenAmount> <transferredTokenCategory.decimalsFactor> OP_DIV).$(<transferredTokenAmount> <transferredTokenCategory.decimalsFactor> OP_MOD) $(<transferredTokenCategory.symbol>) tokens to a recipient.',\n icon: 'send',\n\n roles: {\n receiver: {\n name: 'Received',\n description:\n 'Received $(<transferredTokenAmount> <transferredTokenCategory.decimalsFactor> OP_DIV).$(<transferredTokenAmount> <transferredTokenCategory.decimalsFactor> OP_MOD) $(<transferredTokenCategory.symbol>) tokens.',\n },\n sender: {\n name: 'Sent',\n description:\n 'Sent $(<transferredTokenAmount> <transferredTokenCategory.decimalsFactor> OP_DIV).$(<transferredTokenAmount> <transferredTokenCategory.decimalsFactor> OP_MOD) $(<transferredTokenCategory.symbol>) tokens.',\n },\n },\n\n // Use the recipients lockscript.\n lockingScript: 'sendingLockingscript',\n\n // Set the amount of fungible tokens to transfer.\n token: {\n category: '$(<transferredTokenCategory>)',\n amount: '$(<transferredTokenAmount>)',\n },\n },\n transferNonfungibleTokenOutput: {\n name: 'Recipient output',\n description:\n 'Transferred one non-fungible $(<transferredTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <transferredTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) $(<transferredTokenCategory.symbol>) token to a recipient, with $(<transferredTokenCommitment>) commitment.',\n icon: 'send',\n\n roles: {\n receiver: {\n name: 'Received',\n description:\n 'Received one non-fungible $(<transferredTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <transferredTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) $(<transferredTokenCategory.symbol>) token, with $(<transferredTokenCommitment>) commitment.',\n },\n sender: {\n name: 'Sent',\n description:\n 'Sent one non-fungible $(<transferredTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <transferredTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) $(<transferredTokenCategory.symbol>) token, with $(<transferredTokenCommitment>) commitment.',\n },\n },\n\n // Use the recipients lockscript.\n lockingScript: 'sendingLockingscript',\n\n // Set the non-fungible token to transfer.\n token: {\n category: '$(<transferredTokenCategory>)',\n nft: {\n capability: '$(<transferredTokenCapability>)',\n commitment: '$(<transferredTokenCommitment>)',\n },\n },\n },\n },\n\n inputs: {\n burnFungibleTokensInput: {\n name: 'Deleted fungible tokens',\n description: 'Permanently and irreversibly deleted $(<burnedTokenAmount>) $(<burnedTokenCategory>).',\n icon: 'burn',\n\n // Define which unlocking script unlocks this input.\n unlockingScript: 'unlockP2PKH',\n\n // Require a fungible token of the requested token category, with an amount larger than or equal to the requested amount to burn.\n token: {\n category: '$(<burnedTokenCategory>)',\n amount: '$(<this.fungibleTokenAmount> <burnedTokenAmount> OP_GREATERTHANOREQUAL OP_IF <this.fungibleTokens> OP_ENDIF)',\n },\n\n // Ignore the burned token amount when determining change for this output.\n // NOTE: The engine must check that this does not exceed the input value.\n omitChangeAmounts: {\n fungibleTokens: '${<burnedTokenAmount>}',\n },\n },\n burnNonfungibleTokenInput: {\n name: 'Deleted non-fungible token',\n description:\n 'Permanently and irreversibly burned one non-fungible $(<burnedTokenCapability> <0x02> OP_EQUAL OP_IF <\"minting\"> OP_ELSE <burnedTokenCapability> <0x01> OP_EQUAL OP_IF <\"mutable\"> OP_ELSE <\"immutable\"> OP_ENDIF OP_ENDIF) token of category $(<burnedTokenCategory>), with a $(<burnedTokenCommitment>) commitment.',\n icon: 'burn',\n\n // Define which unlocking script unlocks this input.\n unlockingScript: 'unlockP2PKH',\n\n // Require a non-fungible token of the specified category, capability and commitment to burn.\n token: {\n category: '$(<burnedTokenCategory>)',\n nft: {\n capability: '$(<burnedTokenCapability>)',\n commitment: '$(<burnedTokenCommitment>)',\n },\n },\n\n // Ignore the burned token when determining change for this output.\n // NOTE: The engine must check that this does not exceed the input value.\n omitChangeAmounts: {\n nonfungibleTokens: 1,\n },\n },\n },\n\n // Define locking scripts used by this template.\n // NOTE: Template supported wallets should automatically track all generated lockscripts for on-chain events.\n lockingScripts: {\n sendingLockingscript: {\n // TODO: This currently describes outputs locked to this script, but all actions creating such outputs already have descriptions.\n // This can either be dropped, or maybe more importantly, should be disambiguated so that lockscripts can provide separate\n // descriptions for their script and the outputs that are locked to them. Leaving as a TODO for now and will address later.\n name: 'Sent',\n description: 'Funds sent to an external recipient',\n icon: 'address',\n\n // ...\n lockingType: 'p2pkh',\n lockingBytecode: 'lockToRecipient',\n\n // Indicate that the sent output does not belong to the initiating user.\n // NOTE: These values default to false/empty, but added here for additional clarity.\n actions: [],\n state: { variables: [], secrets: [] },\n balance: {},\n selectable: false,\n },\n receivingLockingScript: {\n // NOTE: Outputs to this lockscript by external actors defaults to this description when detected on-chain.\n name: 'Received',\n description: 'Funds received without wallet coordination.',\n icon: 'address',\n\n // Defines how spending future received funds should be locked.\n lockingType: 'p2pkh',\n lockingBytecode: 'lockP2PKH',\n\n // Define a default unlocking script to be used when no action provided script is present.\n unlockingBytecode: 'unlockP2PKH',\n\n // Participants without a role or observers cannot take any further actions.\n // NOTE: This is not required but shown here for illustrative purposes.\n actions: [],\n\n roles: {\n receiver: {\n // The only state that is required to be persisted when receiving funds is the owners private key.\n // NOTE: This is defined as a secret to not leak when creating invitations for others to participate in request or send actions.\n state: {\n variables: [],\n secrets: [ 'ownerKey' ],\n },\n\n // List actions that can be taken with the ownerKey for each address/lockscript.\n actions: [\n {\n action: 'sign',\n role: 'owner',\n secrets: [{ ownerKey: null }],\n },\n {\n action: 'verify',\n role: 'owner',\n secrets: [{ ownerKey: null }],\n },\n {\n action: 'sendSatoshis',\n role: 'sender',\n secrets: [{ ownerKey: null }],\n },\n {\n action: 'sendFungibleTokens',\n role: 'sender',\n secrets: [{ ownerKey: null }],\n },\n {\n action: 'sendNonfungibleTokens',\n role: 'sender',\n secrets: [{ ownerKey: null }],\n },\n {\n action: 'burnFungibleTokens',\n role: 'sender',\n secrets: [{ ownerKey: null }],\n },\n {\n action: 'burnNonfungibleTokens',\n role: 'sender',\n secrets: [{ ownerKey: null }],\n },\n ],\n\n // Indicates how much of received funds should be part of a wallets total balance.\n // NOTE: Evaluates in the context of the source transaction, with the current outputs technical data available under this.output.*\n // NOTE: A CashASM expression of '1' means include 100% of this asset in the balance.\n // NOTE: Since we know that the owner controls all assets, we short-cut the evaluations by setting 1 directly.\n balance: {\n satoshis: true,\n fungibleTokens: true,\n nonfungibleTokens: true,\n },\n\n // Indicate when received funds should be considered in automatic coin selection to meet input requirements of other transactions.\n // NOTE: Evaluates in the context of the source transaction, with the current outputs technical data available under this.output.*\n // NOTE: This evaluates to a boolean. If non-true, the output should not be considered for automatic coin selection.\n // NOTE: Since we know that the secret key exist for the owner, this template short-cuts the evaluation by setting true directly.\n selectable: true,\n },\n },\n },\n },\n\n // Define a set of scripts that can be used in this template.\n scripts: {\n lockP2PKH: 'OP_DUP OP_HASH160 <$(<ownerKey.public_key> OP_HASH160)> OP_EQUALVERIFY OP_CHECKSIG',\n unlockP2PKH: '<ownerKey.schnorr_signature.all_outputs> <ownerKey.public_key>',\n lockToRecipient: '<recipientLockingscript>',\n },\n\n // TODO: Add icons\n constants: {\n dustLimit: {\n name: 'Dust Limit',\n description: 'Standard required minimum satoshis for Pay to Public Key Hash outputs.',\n type: 'integer',\n value: 546,\n },\n\n // Define a message prefix for use in arbitrary message signing.\n messagePrefix: {\n name: 'Message Prefix',\n description: 'Standard message prefix used in the bitcoin signed message protocol.',\n type: 'bytes',\n\n // Value is enforced to the bitcoin signing magic string:\n // \"\\x18Bitcoin Signed Message:\\n\"\n value: '0x18426974636f696e205369676e6564204d6573736167653a0a',\n },\n },\n\n // TODO: Add icons\n variables: {\n // Describe the secret private key.\n ownerKey: {\n name: 'Owners Private Key',\n description: 'The private key used to authorize spending of received funds.',\n type: 'bytes',\n hint: 'private_key',\n },\n\n messageToSign: {\n name: 'Message',\n description: 'The text message to sign.',\n type: 'string',\n },\n messageToVerify: {\n name: 'Message',\n description: 'The text message to verify.',\n type: 'string',\n },\n messageSignature: {\n name: 'Message Signature',\n description: 'The signature for the message.',\n type: 'bytes',\n hint: 'signature',\n },\n\n // Describe the parameters used when requesting value.\n requestedSatoshis: {\n name: 'Requested Amount',\n description: 'The Bitcoin Cash amount requested',\n type: 'integer',\n hint: 'satoshis',\n },\n requestedTokenCategory: {\n name: 'Requested Token Category',\n description: 'The token category requested',\n type: 'bytes',\n hint: 'token_category',\n },\n requestedTokenAmount: {\n name: 'Requested Token Amount',\n description: 'The fungible token amount requested',\n type: 'integer',\n hint: 'token_amount',\n },\n requestedTokenCapability: {\n name: 'Requested Token Capability',\n description: 'The non-fungible token capability requested',\n type: 'bytes',\n hint: 'token_capability',\n },\n requestedTokenCommitment: {\n name: 'Requested Token Commitment',\n description: 'The non-fungible token commitment requested',\n type: 'bytes',\n hint: 'token_commitment',\n },\n transferredTokenCategory: {\n name: 'Sending Token Category',\n description: 'The token category of the token(s) to send',\n type: 'bytes',\n hint: 'token_category',\n },\n transferredTokenAmount: {\n name: 'Sending Token Amount',\n description: 'The fungible token amount to send',\n type: 'integer',\n hint: 'token_amount',\n },\n transferredTokenCapability: {\n name: 'Sending Token Capability',\n description: 'The token capability for the non-fungible token to send',\n type: 'bytes',\n hint: 'token_capability',\n },\n transferredTokenCommitment: {\n name: 'Sending Token Commitment',\n description: 'The token commitment for the non-fungible token to send',\n type: 'bytes',\n hint: 'token_commitment',\n },\n burnedTokenCategory: {\n name: 'Deleted Token Category',\n description: 'The token category of the token(s) to delete',\n type: 'bytes',\n hint: 'token_category',\n },\n burnedTokenAmount: {\n name: 'Deleted Token Amount',\n description: 'The fungible token amount to delete',\n type: 'integer',\n hint: 'token_amount',\n },\n burnedTokenCapability: {\n name: 'Deleted Token Capability',\n description: 'The token capability for the non-fungible token to delete',\n type: 'bytes',\n hint: 'token_capability',\n },\n burnedTokenCommitment: {\n name: 'Deleted Token Commitment',\n description: 'The token commitment for the non-fungible token to delete',\n type: 'bytes',\n hint: 'token_commitment',\n },\n },\n\n // Define a list of re-usable icons that can be used as part of metadata.\n // NOTE: the actual icons are not embedded in the template but only referenced by hashes here,\n // and can be distributed either as an asset pack or looked up through something like IPFS.\n icons: [\n {\n name: 'wallet',\n hash: '0000000000000000000000',\n },\n {\n name: 'owner',\n hash: '0000000000000000000000',\n },\n {\n name: 'sender',\n hash: '0000000000000000000000',\n },\n {\n name: 'address',\n hash: '0000000000000000000000',\n },\n {\n name: 'receive',\n hash: '0000000000000000000000',\n },\n {\n name: 'request',\n hash: '0000000000000000000000',\n },\n {\n name: 'send',\n hash: '0000000000000000000000',\n },\n {\n name: 'burn',\n hash: '0000000000000000000000',\n },\n {\n name: 'sign',\n hash: '0000000000000000000000',\n },\n {\n name: 'verify',\n hash: '0000000000000000000000',\n },\n ],\n\n scenarios: [\n {\n name: 'requesting satoshis',\n description: 'happy-path evaluation for requesting satoshis.',\n\n // The action being run in the scenario.\n action: 'requestSatoshis',\n\n // List of roles taken in this scenario, and the resources they provided.\n roles: [\n {\n role: 'receiver',\n values: {\n generated: {\n ownerKey: 'KyRQa5pEXuzVcDwnXRLpYAascjchQW5DoxVRMbj4DTxS83573mz8',\n },\n variables: {\n requestedSatoshis: 2000,\n },\n secrets: {\n // This scenario does not carry any secrets.\n },\n inputs: [],\n outputs: [\n {\n lockingBytecode: '76a91475c715ecb74178fe87933e57e947e5e92d904b8188ac',\n valueSatoshis: 2000,\n },\n ],\n },\n },\n {\n role: 'sender',\n values: {\n // The sender provides no raw data to the action.\n generated: {},\n variables: {},\n secrets: {},\n\n // The sender does provide input and change.\n inputs: [\n {\n outpointTransactionHash: '4ef28553a31a266719e66ba97fee3aeecd6d1788f7ff6ab12f8ebceda49660c0',\n outpointIndex: 0,\n sequenceNumber: 0,\n unlockingBytecode:\n '41226b2be7c2890c8bbde2f79e79640e56d866843f2e822ec51c469019d13db04a422c9ee49f5eefd26fee24e91910edbbb032b90cc54c34da80a61e69b0ee3d22412103e7ab26c36a7c7f45b2c26f33c08b0fa43a633268700f47216646d4cb37ae5696',\n },\n ],\n outputs: [\n {\n lockingBytecode: '76a91475c715ecb74178fe87933e57e947e5e92d904b8188ac',\n valueSatoshis: 2000,\n },\n ],\n },\n },\n ],\n\n // List of resources provided outside the context of a role.\n values: {\n generated: {\n // This scenario does not have any non-role generated values.\n },\n variables: {\n // This scenario does not have any non-role variables.\n },\n secrets: {\n // This scenario does not have any non-role secrets.\n },\n },\n\n // Outcomes provides the set of resulting values created from the action.\n outcome: {\n roles: {\n receiver: {\n name: 'Request',\n description: 'Requested a specific amount of satoshis from one or more senders.',\n icon: 'request',\n },\n sender: {\n name: 'Send',\n description: 'Sent a specific amount of satoshis to the provided receiver.',\n icon: 'send',\n },\n },\n\n transactions: [\n {\n transaction:\n '0200000001c06096a4edbc8e2fb16afff788176dcdee3aee7fa96be61967261aa35385f24e000000006441226b2be7c2890c8bbde2f79e79640e56d866843f2e822ec51c469019d13db04a422c9ee49f5eefd26fee24e91910edbbb032b90cc54c34da80a61e69b0ee3d22412103e7ab26c36a7c7f45b2c26f33c08b0fa43a633268700f47216646d4cb37ae5696000000000267530300000000001976a91475c715ecb74178fe87933e57e947e5e92d904b8188acd0070000000000001976a91475c715ecb74178fe87933e57e947e5e92d904b8188ac00000000',\n value: '',\n },\n ],\n },\n },\n ],\n};\n"],"mappings":"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,UAAU,MAAM,CAAC;MAChC;KACJ;IAMD,SAAS;KACL,UAAU;KACV,gBAAgB;KAChB,mBAAmB;KACtB;IAMD,YAAY;IACf,EACJ;GACJ;EACJ;CAGD,SAAS;EACL,WAAW;EACX,aAAa;EACb,iBAAiB;EACpB;CAGD,WAAW;EACP,WAAW;GACP,MAAM;GACN,aAAa;GACb,MAAM;GACN,OAAO;GACV;EAGD,eAAe;GACX,MAAM;GACN,aAAa;GACb,MAAM;GAIN,OAAO;GACV;EACJ;CAGD,WAAW;EAEP,UAAU;GACN,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EAED,eAAe;GACX,MAAM;GACN,aAAa;GACb,MAAM;GACT;EACD,iBAAiB;GACb,MAAM;GACN,aAAa;GACb,MAAM;GACT;EACD,kBAAkB;GACd,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EAGD,mBAAmB;GACf,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EACD,wBAAwB;GACpB,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EACD,sBAAsB;GAClB,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EACD,0BAA0B;GACtB,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EACD,0BAA0B;GACtB,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EACD,0BAA0B;GACtB,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EACD,wBAAwB;GACpB,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EACD,4BAA4B;GACxB,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EACD,4BAA4B;GACxB,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EACD,qBAAqB;GACjB,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EACD,mBAAmB;GACf,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EACD,uBAAuB;GACnB,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EACD,uBAAuB;GACnB,MAAM;GACN,aAAa;GACb,MAAM;GACN,MAAM;GACT;EACJ;CAKD,OAAO;EACH;GACI,MAAM;GACN,MAAM;GACT;EACD;GACI,MAAM;GACN,MAAM;GACT;EACD;GACI,MAAM;GACN,MAAM;GACT;EACD;GACI,MAAM;GACN,MAAM;GACT;EACD;GACI,MAAM;GACN,MAAM;GACT;EACD;GACI,MAAM;GACN,MAAM;GACT;EACD;GACI,MAAM;GACN,MAAM;GACT;EACD;GACI,MAAM;GACN,MAAM;GACT;EACD;GACI,MAAM;GACN,MAAM;GACT;EACD;GACI,MAAM;GACN,MAAM;GACT;EACJ;CAED,WAAW,CACP;EACI,MAAM;EACN,aAAa;EAGb,QAAQ;EAGR,OAAO,CACH;GACI,MAAM;GACN,QAAQ;IACJ,WAAW,EACP,UAAU,wDACb;IACD,WAAW,EACP,mBAAmB,KACtB;IACD,SAAS,EAER;IACD,QAAQ,EAAE;IACV,SAAS,CACL;KACI,iBAAiB;KACjB,eAAe;KAClB,CACJ;IACJ;GACJ,EACD;GACI,MAAM;GACN,QAAQ;IAEJ,WAAW,EAAE;IACb,WAAW,EAAE;IACb,SAAS,EAAE;IAGX,QAAQ,CACJ;KACI,yBAAyB;KACzB,eAAe;KACf,gBAAgB;KAChB,mBACI;KACP,CACJ;IACD,SAAS,CACL;KACI,iBAAiB;KACjB,eAAe;KAClB,CACJ;IACJ;GACJ,CACJ;EAGD,QAAQ;GACJ,WAAW,EAEV;GACD,WAAW,EAEV;GACD,SAAS,EAER;GACJ;EAGD,SAAS;GACL,OAAO;IACH,UAAU;KACN,MAAM;KACN,aAAa;KACb,MAAM;KACT;IACD,QAAQ;KACJ,MAAM;KACN,aAAa;KACb,MAAM;KACT;IACJ;GAED,cAAc,CACV;IACI,aACI;IACJ,OAAO;IACV,CACJ;GACJ;EACJ,CACJ;CACJ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xo-cash/templates",
3
- "version": "0.0.1-development.13733087628",
3
+ "version": "0.0.1",
4
4
  "description": "XO templates",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.mts",
@@ -42,7 +42,7 @@
42
42
  "xo"
43
43
  ],
44
44
  "dependencies": {
45
- "@xo-cash/types": "0.0.1-development.13730885533"
45
+ "@xo-cash/types": "0.0.1"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@chalp/eslint-airbnb": "^1.3.0",