@arkade-os/sdk 0.3.12 → 0.4.0-next.0

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.
Files changed (250) hide show
  1. package/README.md +483 -54
  2. package/dist/cjs/adapters/expo-db.js +35 -0
  3. package/dist/cjs/asset/assetGroup.js +141 -0
  4. package/dist/cjs/asset/assetId.js +88 -0
  5. package/dist/cjs/asset/assetInput.js +204 -0
  6. package/dist/cjs/asset/assetOutput.js +159 -0
  7. package/dist/cjs/asset/assetRef.js +82 -0
  8. package/dist/cjs/asset/index.js +24 -0
  9. package/dist/cjs/asset/metadata.js +172 -0
  10. package/dist/cjs/asset/packet.js +164 -0
  11. package/dist/cjs/asset/types.js +25 -0
  12. package/dist/cjs/asset/utils.js +105 -0
  13. package/dist/cjs/contracts/arkcontract.js +148 -0
  14. package/dist/cjs/contracts/contractManager.js +436 -0
  15. package/dist/cjs/contracts/contractWatcher.js +567 -0
  16. package/dist/cjs/contracts/handlers/default.js +85 -0
  17. package/dist/cjs/contracts/handlers/delegate.js +89 -0
  18. package/dist/cjs/contracts/handlers/helpers.js +105 -0
  19. package/dist/cjs/contracts/handlers/index.js +19 -0
  20. package/dist/cjs/contracts/handlers/registry.js +89 -0
  21. package/dist/cjs/contracts/handlers/vhtlc.js +193 -0
  22. package/dist/cjs/contracts/index.js +41 -0
  23. package/dist/cjs/contracts/types.js +2 -0
  24. package/dist/cjs/db/manager.js +97 -0
  25. package/dist/cjs/forfeit.js +12 -8
  26. package/dist/cjs/identity/index.js +1 -0
  27. package/dist/cjs/identity/seedIdentity.js +255 -0
  28. package/dist/cjs/index.js +70 -14
  29. package/dist/cjs/intent/index.js +28 -2
  30. package/dist/cjs/providers/ark.js +7 -0
  31. package/dist/cjs/providers/delegator.js +66 -0
  32. package/dist/cjs/providers/expoIndexer.js +5 -0
  33. package/dist/cjs/providers/indexer.js +68 -1
  34. package/dist/cjs/providers/onchain.js +2 -2
  35. package/dist/cjs/providers/utils.js +1 -0
  36. package/dist/cjs/repositories/contractRepository.js +0 -103
  37. package/dist/cjs/repositories/inMemory/contractRepository.js +55 -0
  38. package/dist/cjs/repositories/inMemory/walletRepository.js +80 -0
  39. package/dist/cjs/repositories/index.js +16 -0
  40. package/dist/cjs/repositories/indexedDB/contractRepository.js +187 -0
  41. package/dist/cjs/repositories/indexedDB/db.js +57 -0
  42. package/dist/cjs/repositories/indexedDB/schema.js +159 -0
  43. package/dist/cjs/repositories/indexedDB/walletRepository.js +338 -0
  44. package/dist/cjs/repositories/indexedDB/websqlAdapter.js +144 -0
  45. package/dist/cjs/repositories/migrations/contractRepositoryImpl.js +127 -0
  46. package/dist/cjs/repositories/migrations/fromStorageAdapter.js +66 -0
  47. package/dist/cjs/repositories/migrations/walletRepositoryImpl.js +180 -0
  48. package/dist/cjs/repositories/walletRepository.js +0 -169
  49. package/dist/cjs/script/base.js +54 -0
  50. package/dist/cjs/script/delegate.js +49 -0
  51. package/dist/cjs/storage/asyncStorage.js +4 -1
  52. package/dist/cjs/storage/fileSystem.js +3 -0
  53. package/dist/cjs/storage/inMemory.js +3 -0
  54. package/dist/cjs/storage/indexedDB.js +5 -1
  55. package/dist/cjs/storage/localStorage.js +3 -0
  56. package/dist/cjs/utils/arkTransaction.js +16 -0
  57. package/dist/cjs/utils/transactionHistory.js +50 -0
  58. package/dist/cjs/utils/txSizeEstimator.js +39 -14
  59. package/dist/cjs/wallet/asset-manager.js +338 -0
  60. package/dist/cjs/wallet/asset.js +117 -0
  61. package/dist/cjs/wallet/batch.js +1 -1
  62. package/dist/cjs/wallet/delegator.js +235 -0
  63. package/dist/cjs/wallet/expo/background.js +133 -0
  64. package/dist/cjs/wallet/expo/index.js +9 -0
  65. package/dist/cjs/wallet/expo/wallet.js +231 -0
  66. package/dist/cjs/wallet/onchain.js +57 -12
  67. package/dist/cjs/wallet/serviceWorker/wallet-message-handler.js +568 -0
  68. package/dist/cjs/wallet/serviceWorker/wallet.js +383 -102
  69. package/dist/cjs/wallet/unroll.js +7 -2
  70. package/dist/cjs/wallet/utils.js +60 -0
  71. package/dist/cjs/wallet/validation.js +151 -0
  72. package/dist/cjs/wallet/vtxo-manager.js +1 -1
  73. package/dist/cjs/wallet/wallet.js +702 -260
  74. package/dist/cjs/worker/browser/service-worker-manager.js +82 -0
  75. package/dist/cjs/{wallet/serviceWorker → worker/browser}/utils.js +2 -1
  76. package/dist/cjs/worker/expo/asyncStorageTaskQueue.js +78 -0
  77. package/dist/cjs/worker/expo/index.js +12 -0
  78. package/dist/cjs/worker/expo/processors/contractPollProcessor.js +61 -0
  79. package/dist/cjs/worker/expo/processors/index.js +6 -0
  80. package/dist/cjs/worker/expo/taskQueue.js +41 -0
  81. package/dist/cjs/worker/expo/taskRunner.js +57 -0
  82. package/dist/cjs/worker/messageBus.js +252 -0
  83. package/dist/esm/adapters/expo-db.js +27 -0
  84. package/dist/esm/asset/assetGroup.js +137 -0
  85. package/dist/esm/asset/assetId.js +84 -0
  86. package/dist/esm/asset/assetInput.js +199 -0
  87. package/dist/esm/asset/assetOutput.js +154 -0
  88. package/dist/esm/asset/assetRef.js +78 -0
  89. package/dist/esm/asset/index.js +8 -0
  90. package/dist/esm/asset/metadata.js +167 -0
  91. package/dist/esm/asset/packet.js +159 -0
  92. package/dist/esm/asset/types.js +22 -0
  93. package/dist/esm/asset/utils.js +99 -0
  94. package/dist/esm/contracts/arkcontract.js +141 -0
  95. package/dist/esm/contracts/contractManager.js +432 -0
  96. package/dist/esm/contracts/contractWatcher.js +563 -0
  97. package/dist/esm/contracts/handlers/default.js +82 -0
  98. package/dist/esm/contracts/handlers/delegate.js +86 -0
  99. package/dist/esm/contracts/handlers/helpers.js +66 -0
  100. package/dist/esm/contracts/handlers/index.js +12 -0
  101. package/dist/esm/contracts/handlers/registry.js +86 -0
  102. package/dist/esm/contracts/handlers/vhtlc.js +190 -0
  103. package/dist/esm/contracts/index.js +13 -0
  104. package/dist/esm/contracts/types.js +1 -0
  105. package/dist/esm/db/manager.js +92 -0
  106. package/dist/esm/forfeit.js +11 -8
  107. package/dist/esm/identity/index.js +1 -0
  108. package/dist/esm/identity/seedIdentity.js +249 -0
  109. package/dist/esm/index.js +25 -15
  110. package/dist/esm/intent/index.js +28 -2
  111. package/dist/esm/providers/ark.js +7 -0
  112. package/dist/esm/providers/delegator.js +62 -0
  113. package/dist/esm/providers/expoIndexer.js +5 -0
  114. package/dist/esm/providers/indexer.js +68 -1
  115. package/dist/esm/providers/onchain.js +2 -2
  116. package/dist/esm/providers/utils.js +1 -0
  117. package/dist/esm/repositories/contractRepository.js +1 -101
  118. package/dist/esm/repositories/inMemory/contractRepository.js +51 -0
  119. package/dist/esm/repositories/inMemory/walletRepository.js +76 -0
  120. package/dist/esm/repositories/index.js +8 -0
  121. package/dist/esm/repositories/indexedDB/contractRepository.js +183 -0
  122. package/dist/esm/repositories/indexedDB/db.js +42 -0
  123. package/dist/esm/repositories/indexedDB/schema.js +155 -0
  124. package/dist/esm/repositories/indexedDB/walletRepository.js +334 -0
  125. package/dist/esm/repositories/indexedDB/websqlAdapter.js +138 -0
  126. package/dist/esm/repositories/migrations/contractRepositoryImpl.js +121 -0
  127. package/dist/esm/repositories/migrations/fromStorageAdapter.js +58 -0
  128. package/dist/esm/repositories/migrations/walletRepositoryImpl.js +176 -0
  129. package/dist/esm/repositories/walletRepository.js +1 -167
  130. package/dist/esm/script/base.js +21 -1
  131. package/dist/esm/script/delegate.js +46 -0
  132. package/dist/esm/storage/asyncStorage.js +4 -1
  133. package/dist/esm/storage/fileSystem.js +3 -0
  134. package/dist/esm/storage/inMemory.js +3 -0
  135. package/dist/esm/storage/indexedDB.js +5 -1
  136. package/dist/esm/storage/localStorage.js +3 -0
  137. package/dist/esm/utils/arkTransaction.js +15 -0
  138. package/dist/esm/utils/transactionHistory.js +50 -0
  139. package/dist/esm/utils/txSizeEstimator.js +39 -14
  140. package/dist/esm/wallet/asset-manager.js +333 -0
  141. package/dist/esm/wallet/asset.js +111 -0
  142. package/dist/esm/wallet/batch.js +1 -1
  143. package/dist/esm/wallet/delegator.js +231 -0
  144. package/dist/esm/wallet/expo/background.js +128 -0
  145. package/dist/esm/wallet/expo/index.js +2 -0
  146. package/dist/esm/wallet/expo/wallet.js +194 -0
  147. package/dist/esm/wallet/onchain.js +57 -12
  148. package/dist/esm/wallet/serviceWorker/wallet-message-handler.js +564 -0
  149. package/dist/esm/wallet/serviceWorker/wallet.js +382 -101
  150. package/dist/esm/wallet/unroll.js +7 -2
  151. package/dist/esm/wallet/utils.js +55 -0
  152. package/dist/esm/wallet/validation.js +139 -0
  153. package/dist/esm/wallet/vtxo-manager.js +1 -1
  154. package/dist/esm/wallet/wallet.js +704 -229
  155. package/dist/esm/worker/browser/service-worker-manager.js +76 -0
  156. package/dist/esm/{wallet/serviceWorker → worker/browser}/utils.js +2 -1
  157. package/dist/esm/worker/expo/asyncStorageTaskQueue.js +74 -0
  158. package/dist/esm/worker/expo/index.js +4 -0
  159. package/dist/esm/worker/expo/processors/contractPollProcessor.js +58 -0
  160. package/dist/esm/worker/expo/processors/index.js +1 -0
  161. package/dist/esm/worker/expo/taskQueue.js +37 -0
  162. package/dist/esm/worker/expo/taskRunner.js +54 -0
  163. package/dist/esm/worker/messageBus.js +248 -0
  164. package/dist/types/adapters/expo-db.d.ts +7 -0
  165. package/dist/types/asset/assetGroup.d.ts +28 -0
  166. package/dist/types/asset/assetId.d.ts +19 -0
  167. package/dist/types/asset/assetInput.d.ts +46 -0
  168. package/dist/types/asset/assetOutput.d.ts +39 -0
  169. package/dist/types/asset/assetRef.d.ts +25 -0
  170. package/dist/types/asset/index.d.ts +8 -0
  171. package/dist/types/asset/metadata.d.ts +37 -0
  172. package/dist/types/asset/packet.d.ts +27 -0
  173. package/dist/types/asset/types.d.ts +18 -0
  174. package/dist/types/asset/utils.d.ts +21 -0
  175. package/dist/types/contracts/arkcontract.d.ts +101 -0
  176. package/dist/types/contracts/contractManager.d.ts +331 -0
  177. package/dist/types/contracts/contractWatcher.d.ts +192 -0
  178. package/dist/types/contracts/handlers/default.d.ts +19 -0
  179. package/dist/types/contracts/handlers/delegate.d.ts +21 -0
  180. package/dist/types/contracts/handlers/helpers.d.ts +18 -0
  181. package/dist/types/contracts/handlers/index.d.ts +7 -0
  182. package/dist/types/contracts/handlers/registry.d.ts +65 -0
  183. package/dist/types/contracts/handlers/vhtlc.d.ts +32 -0
  184. package/dist/types/contracts/index.d.ts +14 -0
  185. package/dist/types/contracts/types.d.ts +222 -0
  186. package/dist/types/db/manager.d.ts +22 -0
  187. package/dist/types/forfeit.d.ts +2 -1
  188. package/dist/types/identity/index.d.ts +1 -0
  189. package/dist/types/identity/seedIdentity.d.ts +128 -0
  190. package/dist/types/index.d.ts +21 -12
  191. package/dist/types/intent/index.d.ts +2 -1
  192. package/dist/types/providers/ark.d.ts +11 -2
  193. package/dist/types/providers/delegator.d.ts +29 -0
  194. package/dist/types/providers/indexer.d.ts +11 -1
  195. package/dist/types/repositories/contractRepository.d.ts +30 -19
  196. package/dist/types/repositories/inMemory/contractRepository.d.ts +17 -0
  197. package/dist/types/repositories/inMemory/walletRepository.d.ts +26 -0
  198. package/dist/types/repositories/index.d.ts +7 -0
  199. package/dist/types/repositories/indexedDB/contractRepository.d.ts +21 -0
  200. package/dist/types/repositories/indexedDB/db.d.ts +56 -0
  201. package/dist/types/repositories/indexedDB/schema.d.ts +8 -0
  202. package/dist/types/repositories/indexedDB/walletRepository.d.ts +25 -0
  203. package/dist/types/repositories/indexedDB/websqlAdapter.d.ts +49 -0
  204. package/dist/types/repositories/migrations/contractRepositoryImpl.d.ts +24 -0
  205. package/dist/types/repositories/migrations/fromStorageAdapter.d.ts +19 -0
  206. package/dist/types/repositories/migrations/walletRepositoryImpl.d.ts +27 -0
  207. package/dist/types/repositories/walletRepository.d.ts +13 -24
  208. package/dist/types/script/base.d.ts +1 -0
  209. package/dist/types/script/delegate.d.ts +36 -0
  210. package/dist/types/storage/asyncStorage.d.ts +4 -0
  211. package/dist/types/storage/fileSystem.d.ts +3 -0
  212. package/dist/types/storage/inMemory.d.ts +3 -0
  213. package/dist/types/storage/index.d.ts +3 -0
  214. package/dist/types/storage/indexedDB.d.ts +3 -0
  215. package/dist/types/storage/localStorage.d.ts +3 -0
  216. package/dist/types/utils/arkTransaction.d.ts +6 -0
  217. package/dist/types/utils/txSizeEstimator.d.ts +12 -2
  218. package/dist/types/wallet/asset-manager.d.ts +78 -0
  219. package/dist/types/wallet/asset.d.ts +21 -0
  220. package/dist/types/wallet/batch.d.ts +1 -1
  221. package/dist/types/wallet/delegator.d.ts +24 -0
  222. package/dist/types/wallet/expo/background.d.ts +66 -0
  223. package/dist/types/wallet/expo/index.d.ts +4 -0
  224. package/dist/types/wallet/expo/wallet.d.ts +97 -0
  225. package/dist/types/wallet/index.d.ts +75 -2
  226. package/dist/types/wallet/onchain.d.ts +22 -1
  227. package/dist/types/wallet/serviceWorker/wallet-message-handler.d.ts +366 -0
  228. package/dist/types/wallet/serviceWorker/wallet.d.ts +20 -11
  229. package/dist/types/wallet/utils.d.ts +13 -1
  230. package/dist/types/wallet/validation.d.ts +24 -0
  231. package/dist/types/wallet/wallet.d.ts +111 -17
  232. package/dist/types/worker/browser/service-worker-manager.d.ts +21 -0
  233. package/dist/types/{wallet/serviceWorker → worker/browser}/utils.d.ts +2 -1
  234. package/dist/types/worker/expo/asyncStorageTaskQueue.d.ts +46 -0
  235. package/dist/types/worker/expo/index.d.ts +7 -0
  236. package/dist/types/worker/expo/processors/contractPollProcessor.d.ts +14 -0
  237. package/dist/types/worker/expo/processors/index.d.ts +1 -0
  238. package/dist/types/worker/expo/taskQueue.d.ts +50 -0
  239. package/dist/types/worker/expo/taskRunner.d.ts +42 -0
  240. package/dist/types/worker/messageBus.d.ts +109 -0
  241. package/package.json +71 -17
  242. package/dist/cjs/wallet/serviceWorker/request.js +0 -78
  243. package/dist/cjs/wallet/serviceWorker/response.js +0 -222
  244. package/dist/cjs/wallet/serviceWorker/worker.js +0 -655
  245. package/dist/esm/wallet/serviceWorker/request.js +0 -75
  246. package/dist/esm/wallet/serviceWorker/response.js +0 -219
  247. package/dist/esm/wallet/serviceWorker/worker.js +0 -651
  248. package/dist/types/wallet/serviceWorker/request.d.ts +0 -74
  249. package/dist/types/wallet/serviceWorker/response.d.ts +0 -123
  250. package/dist/types/wallet/serviceWorker/worker.d.ts +0 -53
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MetadataList = exports.Metadata = void 0;
4
+ const secp256k1_js_1 = require("@noble/curves/secp256k1.js");
5
+ const base_1 = require("@scure/base");
6
+ const utils_js_1 = require("@scure/btc-signer/utils.js");
7
+ const utils_1 = require("./utils");
8
+ /**
9
+ * Metadata represents a key-value pair.
10
+ * @param key - the key
11
+ * @param value - the value
12
+ */
13
+ class Metadata {
14
+ constructor(key, value) {
15
+ this.key = key;
16
+ this.value = value;
17
+ }
18
+ static create(key, value) {
19
+ const md = new Metadata(key, value);
20
+ md.validate();
21
+ return md;
22
+ }
23
+ static fromString(s) {
24
+ let buf;
25
+ try {
26
+ buf = base_1.hex.decode(s);
27
+ }
28
+ catch {
29
+ throw new Error("invalid metadata format, must be hex");
30
+ }
31
+ return Metadata.fromBytes(buf);
32
+ }
33
+ static fromBytes(buf) {
34
+ if (!buf || buf.length === 0) {
35
+ throw new Error("missing metadata");
36
+ }
37
+ const reader = new utils_1.BufferReader(buf);
38
+ return Metadata.fromReader(reader);
39
+ }
40
+ serialize() {
41
+ const writer = new utils_1.BufferWriter();
42
+ this.serializeTo(writer);
43
+ return writer.toBytes();
44
+ }
45
+ toString() {
46
+ return base_1.hex.encode(this.serialize());
47
+ }
48
+ get keyString() {
49
+ return new TextDecoder().decode(this.key);
50
+ }
51
+ get valueString() {
52
+ return new TextDecoder().decode(this.value);
53
+ }
54
+ validate() {
55
+ if (this.key.length === 0) {
56
+ throw new Error("missing metadata key");
57
+ }
58
+ if (this.value.length === 0) {
59
+ throw new Error("missing metadata value");
60
+ }
61
+ }
62
+ static fromReader(reader) {
63
+ let key;
64
+ let value;
65
+ try {
66
+ key = reader.readVarSlice();
67
+ }
68
+ catch {
69
+ throw new Error("invalid metadata length");
70
+ }
71
+ try {
72
+ value = reader.readVarSlice();
73
+ }
74
+ catch {
75
+ throw new Error("invalid metadata length");
76
+ }
77
+ const md = new Metadata(key, value);
78
+ md.validate();
79
+ return md;
80
+ }
81
+ serializeTo(writer) {
82
+ writer.writeVarSlice(this.key);
83
+ writer.writeVarSlice(this.value);
84
+ }
85
+ }
86
+ exports.Metadata = Metadata;
87
+ class MetadataList {
88
+ constructor(items) {
89
+ this.items = items;
90
+ }
91
+ static fromString(s) {
92
+ let buf;
93
+ try {
94
+ buf = base_1.hex.decode(s);
95
+ }
96
+ catch {
97
+ throw new Error("invalid metadata list format");
98
+ }
99
+ return MetadataList.fromBytes(buf);
100
+ }
101
+ static fromBytes(buf) {
102
+ if (!buf || buf.length === 0) {
103
+ throw new Error("missing metadata list");
104
+ }
105
+ const reader = new utils_1.BufferReader(buf);
106
+ return MetadataList.fromReader(reader);
107
+ }
108
+ static fromReader(reader) {
109
+ const count = Number(reader.readVarUint());
110
+ const items = Array.from({ length: count }, () => Metadata.fromReader(reader));
111
+ return new MetadataList(items);
112
+ }
113
+ serializeTo(writer) {
114
+ writer.writeVarUint(this.items.length);
115
+ for (const item of this) {
116
+ item.serializeTo(writer);
117
+ }
118
+ }
119
+ serialize() {
120
+ const writer = new utils_1.BufferWriter();
121
+ this.serializeTo(writer);
122
+ return writer.toBytes();
123
+ }
124
+ [Symbol.iterator]() {
125
+ return this.items[Symbol.iterator]();
126
+ }
127
+ get length() {
128
+ return this.items.length;
129
+ }
130
+ hash() {
131
+ if (this.items.length === 0)
132
+ throw new Error("missing metadata list");
133
+ const levels = buildMetadataMerkleTree(this.items);
134
+ return levels[levels.length - 1][0]; // the last level is the root
135
+ }
136
+ }
137
+ exports.MetadataList = MetadataList;
138
+ MetadataList.ARK_LEAF_TAG = "ArkadeAssetLeaf";
139
+ MetadataList.ARK_BRANCH_TAG = "ArkadeAssetBranch";
140
+ MetadataList.ARK_LEAF_VERSION = 0x00;
141
+ function computeMetadataLeafHash(md) {
142
+ const writer = new utils_1.BufferWriter();
143
+ writer.writeByte(MetadataList.ARK_LEAF_VERSION);
144
+ writer.writeVarSlice(md.key);
145
+ writer.writeVarSlice(md.value);
146
+ return secp256k1_js_1.schnorr.utils.taggedHash(MetadataList.ARK_LEAF_TAG, writer.toBytes());
147
+ }
148
+ function computeMetadataBranchHash(a, b) {
149
+ const [smaller, larger] = (0, utils_js_1.compareBytes)(a, b) === -1 ? [a, b] : [b, a];
150
+ return secp256k1_js_1.schnorr.utils.taggedHash(MetadataList.ARK_BRANCH_TAG, smaller, larger);
151
+ }
152
+ function buildMetadataMerkleTree(leaves) {
153
+ if (leaves.length === 0)
154
+ return [];
155
+ const leafHashes = leaves.map(computeMetadataLeafHash);
156
+ const levels = [leafHashes];
157
+ let current = leafHashes;
158
+ while (current.length > 1) {
159
+ const next = [];
160
+ for (let i = 0; i < current.length; i += 2) {
161
+ if (i + 1 < current.length) {
162
+ next.push(computeMetadataBranchHash(current[i], current[i + 1]));
163
+ }
164
+ else {
165
+ next.push(current[i]);
166
+ }
167
+ }
168
+ levels.push(next);
169
+ current = next;
170
+ }
171
+ return levels;
172
+ }
@@ -0,0 +1,164 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Packet = exports.AssetPacketNotFoundError = void 0;
4
+ const base_1 = require("@scure/base");
5
+ const btc_signer_1 = require("@scure/btc-signer");
6
+ const utils_js_1 = require("@scure/btc-signer/utils.js");
7
+ const types_1 = require("./types");
8
+ const assetGroup_1 = require("./assetGroup");
9
+ const utils_1 = require("./utils");
10
+ class AssetPacketNotFoundError extends Error {
11
+ constructor(txid) {
12
+ super(`asset packet not found in tx ${txid}`);
13
+ this.name = "AssetPacketNotFoundError";
14
+ }
15
+ }
16
+ exports.AssetPacketNotFoundError = AssetPacketNotFoundError;
17
+ /**
18
+ * Packet represents a collection of asset groups.
19
+ * A packet is encoded in OP_RETURN output of an asset transaction.
20
+ * @param groups - the asset groups in the packet
21
+ */
22
+ class Packet {
23
+ constructor(groups) {
24
+ this.groups = groups;
25
+ }
26
+ static create(groups) {
27
+ const p = new Packet(groups);
28
+ p.validate();
29
+ return p;
30
+ }
31
+ static fromString(s) {
32
+ let buf;
33
+ try {
34
+ buf = base_1.hex.decode(s);
35
+ }
36
+ catch {
37
+ throw new Error("invalid output script format, must be hex");
38
+ }
39
+ return Packet.fromScript(buf);
40
+ }
41
+ static fromScript(script) {
42
+ const rawPacket = extractRawPacketFromScript(script);
43
+ const reader = new utils_1.BufferReader(rawPacket);
44
+ return Packet.fromReader(reader);
45
+ }
46
+ static fromTxOut(pkScript) {
47
+ return Packet.fromScript(pkScript);
48
+ }
49
+ static fromTx(tx) {
50
+ for (let i = 0; i < tx.outputsLength; i++) {
51
+ try {
52
+ const output = tx.getOutput(i);
53
+ if (!output?.script) {
54
+ continue;
55
+ }
56
+ return Packet.fromScript(output.script);
57
+ }
58
+ catch (error) {
59
+ continue;
60
+ }
61
+ }
62
+ throw new AssetPacketNotFoundError(tx.id);
63
+ }
64
+ static isAssetPacket(script) {
65
+ try {
66
+ extractRawPacketFromScript(script);
67
+ return true;
68
+ }
69
+ catch {
70
+ return false;
71
+ }
72
+ }
73
+ leafTxPacket(intentTxid) {
74
+ const leafGroups = this.groups.map((group) => group.toBatchLeafAssetGroup(intentTxid));
75
+ return new Packet(leafGroups);
76
+ }
77
+ txOut() {
78
+ return {
79
+ script: this.serialize(),
80
+ amount: 0n,
81
+ };
82
+ }
83
+ serialize() {
84
+ const writer = new utils_1.BufferWriter();
85
+ writer.writeVarUint(this.groups.length);
86
+ for (const group of this.groups) {
87
+ group.serializeTo(writer);
88
+ }
89
+ const packetData = writer.toBytes();
90
+ const data = (0, utils_js_1.concatBytes)(types_1.ARKADE_MAGIC, new Uint8Array([types_1.MARKER_ASSET_PAYLOAD]), packetData);
91
+ return buildOpReturnScript(data);
92
+ }
93
+ toString() {
94
+ return base_1.hex.encode(this.serialize());
95
+ }
96
+ validate() {
97
+ if (this.groups.length === 0) {
98
+ throw new Error("missing assets");
99
+ }
100
+ for (const group of this.groups) {
101
+ if (group.controlAsset !== null &&
102
+ group.controlAsset.ref.type === types_1.AssetRefType.ByGroup &&
103
+ group.controlAsset.ref.groupIndex >= this.groups.length) {
104
+ throw new Error(`invalid control asset group index, ${group.controlAsset.ref.groupIndex} out of range [0, ${this.groups.length - 1}]`);
105
+ }
106
+ }
107
+ }
108
+ static fromReader(reader) {
109
+ const count = Number(reader.readVarUint());
110
+ const groups = [];
111
+ for (let i = 0; i < count; i++) {
112
+ groups.push(assetGroup_1.AssetGroup.fromReader(reader));
113
+ }
114
+ if (reader.remaining() > 0) {
115
+ throw new Error(`invalid packet length, left ${reader.remaining()} unknown bytes to read`);
116
+ }
117
+ const packet = new Packet(groups);
118
+ packet.validate();
119
+ return packet;
120
+ }
121
+ }
122
+ exports.Packet = Packet;
123
+ function extractRawPacketFromScript(script) {
124
+ if (!script || script.length === 0) {
125
+ throw new Error("missing output script");
126
+ }
127
+ let decoded;
128
+ try {
129
+ decoded = btc_signer_1.Script.decode(script);
130
+ }
131
+ catch {
132
+ throw new Error("invalid OP_RETURN output script");
133
+ }
134
+ if (decoded.length === 0 || decoded[0] !== "RETURN") {
135
+ throw new Error("OP_RETURN not found in output script");
136
+ }
137
+ // concat all data pushes after RETURN
138
+ const dataPushes = decoded
139
+ .slice(1)
140
+ .filter((item) => item instanceof Uint8Array);
141
+ if (dataPushes.length === 0) {
142
+ throw new Error("missing OP_RETURN data");
143
+ }
144
+ const payload = (0, utils_js_1.concatBytes)(...dataPushes);
145
+ if (payload.length < types_1.ARKADE_MAGIC.length + 1) {
146
+ throw new Error("invalid script length");
147
+ }
148
+ const magicSlice = new Uint8Array(payload.slice(0, types_1.ARKADE_MAGIC.length));
149
+ if (!(0, utils_js_1.equalBytes)(magicSlice, types_1.ARKADE_MAGIC)) {
150
+ throw new Error(`invalid magic prefix, got ${base_1.hex.encode(magicSlice)} want ${base_1.hex.encode(types_1.ARKADE_MAGIC)}`);
151
+ }
152
+ const marker = payload[types_1.ARKADE_MAGIC.length];
153
+ if (marker !== types_1.MARKER_ASSET_PAYLOAD) {
154
+ throw new Error(`invalid asset marker, got ${marker} want ${types_1.MARKER_ASSET_PAYLOAD}`);
155
+ }
156
+ const packetData = new Uint8Array(payload.slice(types_1.ARKADE_MAGIC.length + 1));
157
+ if (packetData.length === 0) {
158
+ throw new Error("missing packet data");
159
+ }
160
+ return packetData;
161
+ }
162
+ function buildOpReturnScript(data) {
163
+ return btc_signer_1.Script.encode(["RETURN", data]);
164
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MARKER_ASSET_PAYLOAD = exports.ARKADE_MAGIC = exports.MASK_METADATA = exports.MASK_CONTROL_ASSET = exports.MASK_ASSET_ID = exports.AssetRefType = exports.AssetInputType = exports.ASSET_VERSION = exports.ASSET_ID_SIZE = exports.TX_HASH_SIZE = void 0;
4
+ exports.TX_HASH_SIZE = 32;
5
+ exports.ASSET_ID_SIZE = 34;
6
+ exports.ASSET_VERSION = 0x01;
7
+ var AssetInputType;
8
+ (function (AssetInputType) {
9
+ AssetInputType[AssetInputType["Unspecified"] = 0] = "Unspecified";
10
+ AssetInputType[AssetInputType["Local"] = 1] = "Local";
11
+ AssetInputType[AssetInputType["Intent"] = 2] = "Intent";
12
+ })(AssetInputType || (exports.AssetInputType = AssetInputType = {}));
13
+ var AssetRefType;
14
+ (function (AssetRefType) {
15
+ AssetRefType[AssetRefType["Unspecified"] = 0] = "Unspecified";
16
+ AssetRefType[AssetRefType["ByID"] = 1] = "ByID";
17
+ AssetRefType[AssetRefType["ByGroup"] = 2] = "ByGroup";
18
+ })(AssetRefType || (exports.AssetRefType = AssetRefType = {}));
19
+ // Presence byte masks for AssetGroup
20
+ exports.MASK_ASSET_ID = 0x01;
21
+ exports.MASK_CONTROL_ASSET = 0x02;
22
+ exports.MASK_METADATA = 0x04;
23
+ // ARK magic bytes and marker
24
+ exports.ARKADE_MAGIC = new Uint8Array([0x41, 0x52, 0x4b]); // "ARK"
25
+ exports.MARKER_ASSET_PAYLOAD = 0x00;
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BufferReader = exports.BufferWriter = void 0;
4
+ exports.isZeroBytes = isZeroBytes;
5
+ class BufferWriter {
6
+ constructor() {
7
+ this.buffer = [];
8
+ }
9
+ write(data) {
10
+ for (const byte of data) {
11
+ this.buffer.push(byte);
12
+ }
13
+ }
14
+ writeByte(byte) {
15
+ this.buffer.push(byte & 0xff);
16
+ }
17
+ writeUint16LE(value) {
18
+ const buf = new Uint8Array(2);
19
+ new DataView(buf.buffer).setUint16(0, value, true); // true = little endian
20
+ this.write(buf);
21
+ }
22
+ writeVarUint(value) {
23
+ if (typeof value === "number") {
24
+ if (!Number.isInteger(value) || value < 0) {
25
+ throw new RangeError("writeVarUint: value must be a non-negative integer");
26
+ }
27
+ }
28
+ else if (value < 0n) {
29
+ throw new RangeError("writeVarUint: value must be a non-negative integer");
30
+ }
31
+ const val = typeof value === "number" ? BigInt(value) : value;
32
+ const bytes = [];
33
+ let remaining = val;
34
+ do {
35
+ let byte = Number(remaining & 0x7fn);
36
+ remaining >>= 7n;
37
+ if (remaining > 0n) {
38
+ byte |= 0x80;
39
+ }
40
+ bytes.push(byte);
41
+ } while (remaining > 0n);
42
+ this.write(new Uint8Array(bytes));
43
+ }
44
+ writeVarSlice(data) {
45
+ this.writeVarUint(data.length);
46
+ this.write(data);
47
+ }
48
+ toBytes() {
49
+ return new Uint8Array(this.buffer);
50
+ }
51
+ }
52
+ exports.BufferWriter = BufferWriter;
53
+ class BufferReader {
54
+ constructor(data) {
55
+ this.offset = 0;
56
+ this.view = new DataView(data.buffer, data.byteOffset, data.byteLength);
57
+ }
58
+ remaining() {
59
+ return this.view.byteLength - this.offset;
60
+ }
61
+ readByte() {
62
+ if (this.offset >= this.view.byteLength) {
63
+ throw new Error("unexpected end of buffer");
64
+ }
65
+ return this.view.getUint8(this.offset++);
66
+ }
67
+ readSlice(size) {
68
+ if (this.offset + size > this.view.byteLength) {
69
+ throw new Error("unexpected end of buffer");
70
+ }
71
+ const result = new Uint8Array(this.view.buffer, this.view.byteOffset + this.offset, size);
72
+ this.offset += size;
73
+ return result;
74
+ }
75
+ readUint16LE() {
76
+ if (this.offset + 2 > this.view.byteLength) {
77
+ throw new Error("unexpected end of buffer");
78
+ }
79
+ const value = this.view.getUint16(this.offset, true);
80
+ this.offset += 2;
81
+ return value;
82
+ }
83
+ readVarUint() {
84
+ let result = 0n;
85
+ let shift = 0n;
86
+ let byte;
87
+ do {
88
+ if (this.offset >= this.view.byteLength) {
89
+ throw new Error("unexpected end of buffer");
90
+ }
91
+ byte = this.view.getUint8(this.offset++);
92
+ result |= BigInt(byte & 0x7f) << shift;
93
+ shift += 7n;
94
+ } while (byte & 0x80);
95
+ return result;
96
+ }
97
+ readVarSlice() {
98
+ const length = Number(this.readVarUint());
99
+ return this.readSlice(length);
100
+ }
101
+ }
102
+ exports.BufferReader = BufferReader;
103
+ function isZeroBytes(bytes) {
104
+ return bytes.every((byte) => byte === 0);
105
+ }
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.encodeArkContract = encodeArkContract;
4
+ exports.decodeArkContract = decodeArkContract;
5
+ exports.contractFromArkContract = contractFromArkContract;
6
+ exports.contractFromArkContractWithAddress = contractFromArkContractWithAddress;
7
+ exports.isArkContract = isArkContract;
8
+ const base_1 = require("@scure/base");
9
+ const handlers_1 = require("./handlers");
10
+ /**
11
+ * Prefix for arkcontract strings.
12
+ */
13
+ const ARKCONTRACT_PREFIX = "arkcontract";
14
+ /**
15
+ * Encode a contract to the arkcontract string format.
16
+ *
17
+ * Format: arkcontract={type}&{key1}={value1}&{key2}={value2}...
18
+ *
19
+ * This format is compatible with NArk and allows contracts to be
20
+ * shared/imported across different Ark implementations.
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * const contract: Contract = {
25
+ * type: "vhtlc",
26
+ * params: { sender: "ab12...", receiver: "cd34...", ... },
27
+ * // ...
28
+ * };
29
+ *
30
+ * const encoded = encodeArkContract(contract);
31
+ * // "arkcontract=vhtlc&sender=ab12...&receiver=cd34...&..."
32
+ * ```
33
+ */
34
+ function encodeArkContract(contract) {
35
+ const params = new URLSearchParams();
36
+ // Add contract type first
37
+ params.set(ARKCONTRACT_PREFIX, contract.type);
38
+ // Add all params
39
+ for (const [key, value] of Object.entries(contract.params)) {
40
+ params.set(key, value);
41
+ }
42
+ return params.toString();
43
+ }
44
+ /**
45
+ * Decode an arkcontract string into raw type and data.
46
+ *
47
+ * This is a low-level function that parses the URL-encoded format.
48
+ * For creating typed Contract objects, use `contractFromArkContract`
49
+ * or `contractFromArkContractWithAddress` instead.
50
+ *
51
+ * @param encoded - The arkcontract string
52
+ * @returns Parsed type and key-value data
53
+ * @throws If the string is not a valid arkcontract
54
+ *
55
+ * @example
56
+ * ```typescript
57
+ * const parsed = decodeArkContract("arkcontract=vhtlc&sender=ab12...");
58
+ * // { type: "vhtlc", data: { sender: "ab12...", ... } }
59
+ * ```
60
+ */
61
+ function decodeArkContract(encoded) {
62
+ const params = new URLSearchParams(encoded);
63
+ // Extract type from the arkcontract key
64
+ const type = params.get(ARKCONTRACT_PREFIX);
65
+ if (!type) {
66
+ throw new Error(`Invalid arkcontract string: missing '${ARKCONTRACT_PREFIX}' key`);
67
+ }
68
+ // Build data object from all other params
69
+ const data = {};
70
+ for (const [key, value] of params.entries()) {
71
+ if (key !== ARKCONTRACT_PREFIX) {
72
+ data[key] = value;
73
+ }
74
+ }
75
+ return { type, data };
76
+ }
77
+ /**
78
+ * Create a Contract from an arkcontract string.
79
+ *
80
+ * This requires a handler to be registered for the contract type.
81
+ *
82
+ * @param encoded - The arkcontract string
83
+ * @param options - Additional options for the contract
84
+ * @returns A Contract object
85
+ * @throws If the string is invalid or no handler exists for the type
86
+ *
87
+ * @example
88
+ * ```typescript
89
+ * const contract = contractFromArkContract(
90
+ * "arkcontract=vhtlc&sender=ab12...",
91
+ * {
92
+ * label: "Lightning Receive",
93
+ * }
94
+ * );
95
+ * ```
96
+ */
97
+ function contractFromArkContract(encoded, options = {}) {
98
+ const parsed = decodeArkContract(encoded);
99
+ const handler = handlers_1.contractHandlers.get(parsed.type);
100
+ if (!handler) {
101
+ throw new Error(`No handler registered for contract type '${parsed.type}'`);
102
+ }
103
+ // Separate params from runtime data
104
+ // This is type-specific - the handler knows which keys are params
105
+ // For now, we treat all data as params
106
+ const params = parsed.data;
107
+ return {
108
+ label: options.label,
109
+ type: parsed.type,
110
+ params,
111
+ state: options.state || "active",
112
+ createdAt: Date.now(),
113
+ expiresAt: options.expiresAt,
114
+ metadata: options.metadata,
115
+ };
116
+ }
117
+ /**
118
+ * Create a full Contract with derived script and address.
119
+ *
120
+ * @param encoded - The arkcontract string
121
+ * @param serverPubKey - Server public key (for address derivation)
122
+ * @param addressPrefix - Address prefix (e.g., "tark" for testnet)
123
+ * @param options - Additional options
124
+ * @returns A complete Contract object
125
+ */
126
+ function contractFromArkContractWithAddress(encoded, serverPubKey, addressPrefix, options = {}) {
127
+ const parsed = decodeArkContract(encoded);
128
+ const handler = handlers_1.contractHandlers.getOrThrow(parsed.type);
129
+ const params = parsed.data;
130
+ const vtxoScript = handler.createScript(params);
131
+ return {
132
+ label: options.label,
133
+ type: parsed.type,
134
+ params,
135
+ script: base_1.hex.encode(vtxoScript.pkScript),
136
+ address: vtxoScript.address(addressPrefix, serverPubKey).encode(),
137
+ state: options.state || "active",
138
+ createdAt: Date.now(),
139
+ expiresAt: options.expiresAt,
140
+ metadata: options.metadata,
141
+ };
142
+ }
143
+ /**
144
+ * Check if a string is an arkcontract.
145
+ */
146
+ function isArkContract(str) {
147
+ return str.startsWith(ARKCONTRACT_PREFIX + "=");
148
+ }