@arkade-os/sdk 0.3.13 → 0.4.0-next.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.
Files changed (270) hide show
  1. package/README.md +586 -54
  2. package/dist/cjs/asset/assetGroup.js +141 -0
  3. package/dist/cjs/asset/assetId.js +88 -0
  4. package/dist/cjs/asset/assetInput.js +204 -0
  5. package/dist/cjs/asset/assetOutput.js +159 -0
  6. package/dist/cjs/asset/assetRef.js +82 -0
  7. package/dist/cjs/asset/index.js +24 -0
  8. package/dist/cjs/asset/metadata.js +172 -0
  9. package/dist/cjs/asset/packet.js +164 -0
  10. package/dist/cjs/asset/types.js +25 -0
  11. package/dist/cjs/asset/utils.js +105 -0
  12. package/dist/cjs/bip322/index.js +270 -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/forfeit.js +12 -8
  25. package/dist/cjs/identity/index.js +1 -0
  26. package/dist/cjs/identity/seedIdentity.js +255 -0
  27. package/dist/cjs/index.js +72 -14
  28. package/dist/cjs/intent/index.js +47 -11
  29. package/dist/cjs/providers/ark.js +7 -0
  30. package/dist/cjs/providers/delegator.js +66 -0
  31. package/dist/cjs/providers/expoIndexer.js +5 -0
  32. package/dist/cjs/providers/indexer.js +68 -1
  33. package/dist/cjs/providers/utils.js +1 -0
  34. package/dist/cjs/repositories/contractRepository.js +0 -103
  35. package/dist/cjs/repositories/inMemory/contractRepository.js +55 -0
  36. package/dist/cjs/repositories/inMemory/walletRepository.js +80 -0
  37. package/dist/cjs/repositories/index.js +16 -0
  38. package/dist/cjs/repositories/indexedDB/contractRepository.js +187 -0
  39. package/dist/cjs/repositories/indexedDB/db.js +19 -0
  40. package/dist/cjs/repositories/indexedDB/manager.js +97 -0
  41. package/dist/cjs/repositories/indexedDB/schema.js +159 -0
  42. package/dist/cjs/repositories/indexedDB/walletRepository.js +338 -0
  43. package/dist/cjs/repositories/indexedDB/websqlAdapter.js +144 -0
  44. package/dist/cjs/repositories/migrations/contractRepositoryImpl.js +127 -0
  45. package/dist/cjs/repositories/migrations/fromStorageAdapter.js +66 -0
  46. package/dist/cjs/repositories/migrations/walletRepositoryImpl.js +180 -0
  47. package/dist/cjs/repositories/realm/contractRepository.js +120 -0
  48. package/dist/cjs/repositories/realm/index.js +9 -0
  49. package/dist/cjs/repositories/realm/schemas.js +108 -0
  50. package/dist/cjs/repositories/realm/types.js +7 -0
  51. package/dist/cjs/repositories/realm/walletRepository.js +273 -0
  52. package/dist/cjs/repositories/serialization.js +49 -0
  53. package/dist/cjs/repositories/sqlite/contractRepository.js +139 -0
  54. package/dist/cjs/repositories/sqlite/index.js +7 -0
  55. package/dist/cjs/repositories/sqlite/types.js +2 -0
  56. package/dist/cjs/repositories/sqlite/walletRepository.js +328 -0
  57. package/dist/cjs/repositories/walletRepository.js +0 -169
  58. package/dist/cjs/script/base.js +54 -0
  59. package/dist/cjs/script/delegate.js +49 -0
  60. package/dist/cjs/storage/asyncStorage.js +4 -1
  61. package/dist/cjs/storage/fileSystem.js +3 -0
  62. package/dist/cjs/storage/inMemory.js +3 -0
  63. package/dist/cjs/storage/indexedDB.js +5 -1
  64. package/dist/cjs/storage/localStorage.js +3 -0
  65. package/dist/cjs/utils/arkTransaction.js +16 -0
  66. package/dist/cjs/utils/transactionHistory.js +50 -0
  67. package/dist/cjs/wallet/asset-manager.js +338 -0
  68. package/dist/cjs/wallet/asset.js +117 -0
  69. package/dist/cjs/wallet/batch.js +1 -1
  70. package/dist/cjs/wallet/delegator.js +235 -0
  71. package/dist/cjs/wallet/expo/background.js +133 -0
  72. package/dist/cjs/wallet/expo/index.js +9 -0
  73. package/dist/cjs/wallet/expo/wallet.js +231 -0
  74. package/dist/cjs/wallet/serviceWorker/wallet-message-handler.js +568 -0
  75. package/dist/cjs/wallet/serviceWorker/wallet.js +383 -102
  76. package/dist/cjs/wallet/utils.js +58 -0
  77. package/dist/cjs/wallet/validation.js +151 -0
  78. package/dist/cjs/wallet/vtxo-manager.js +8 -1
  79. package/dist/cjs/wallet/wallet.js +702 -260
  80. package/dist/cjs/worker/browser/service-worker-manager.js +82 -0
  81. package/dist/cjs/{wallet/serviceWorker → worker/browser}/utils.js +2 -1
  82. package/dist/cjs/worker/expo/asyncStorageTaskQueue.js +78 -0
  83. package/dist/cjs/worker/expo/index.js +12 -0
  84. package/dist/cjs/worker/expo/processors/contractPollProcessor.js +61 -0
  85. package/dist/cjs/worker/expo/processors/index.js +6 -0
  86. package/dist/cjs/worker/expo/taskQueue.js +41 -0
  87. package/dist/cjs/worker/expo/taskRunner.js +57 -0
  88. package/dist/cjs/worker/messageBus.js +252 -0
  89. package/dist/esm/asset/assetGroup.js +137 -0
  90. package/dist/esm/asset/assetId.js +84 -0
  91. package/dist/esm/asset/assetInput.js +199 -0
  92. package/dist/esm/asset/assetOutput.js +154 -0
  93. package/dist/esm/asset/assetRef.js +78 -0
  94. package/dist/esm/asset/index.js +8 -0
  95. package/dist/esm/asset/metadata.js +167 -0
  96. package/dist/esm/asset/packet.js +159 -0
  97. package/dist/esm/asset/types.js +22 -0
  98. package/dist/esm/asset/utils.js +99 -0
  99. package/dist/esm/bip322/index.js +267 -0
  100. package/dist/esm/contracts/arkcontract.js +141 -0
  101. package/dist/esm/contracts/contractManager.js +432 -0
  102. package/dist/esm/contracts/contractWatcher.js +563 -0
  103. package/dist/esm/contracts/handlers/default.js +82 -0
  104. package/dist/esm/contracts/handlers/delegate.js +86 -0
  105. package/dist/esm/contracts/handlers/helpers.js +66 -0
  106. package/dist/esm/contracts/handlers/index.js +12 -0
  107. package/dist/esm/contracts/handlers/registry.js +86 -0
  108. package/dist/esm/contracts/handlers/vhtlc.js +190 -0
  109. package/dist/esm/contracts/index.js +13 -0
  110. package/dist/esm/contracts/types.js +1 -0
  111. package/dist/esm/forfeit.js +11 -8
  112. package/dist/esm/identity/index.js +1 -0
  113. package/dist/esm/identity/seedIdentity.js +249 -0
  114. package/dist/esm/index.js +28 -15
  115. package/dist/esm/intent/index.js +44 -9
  116. package/dist/esm/providers/ark.js +7 -0
  117. package/dist/esm/providers/delegator.js +62 -0
  118. package/dist/esm/providers/expoIndexer.js +5 -0
  119. package/dist/esm/providers/indexer.js +68 -1
  120. package/dist/esm/providers/utils.js +1 -0
  121. package/dist/esm/repositories/contractRepository.js +1 -101
  122. package/dist/esm/repositories/inMemory/contractRepository.js +51 -0
  123. package/dist/esm/repositories/inMemory/walletRepository.js +76 -0
  124. package/dist/esm/repositories/index.js +8 -0
  125. package/dist/esm/repositories/indexedDB/contractRepository.js +183 -0
  126. package/dist/esm/repositories/indexedDB/db.js +4 -0
  127. package/dist/esm/repositories/indexedDB/manager.js +92 -0
  128. package/dist/esm/repositories/indexedDB/schema.js +155 -0
  129. package/dist/esm/repositories/indexedDB/walletRepository.js +334 -0
  130. package/dist/esm/repositories/indexedDB/websqlAdapter.js +138 -0
  131. package/dist/esm/repositories/migrations/contractRepositoryImpl.js +121 -0
  132. package/dist/esm/repositories/migrations/fromStorageAdapter.js +58 -0
  133. package/dist/esm/repositories/migrations/walletRepositoryImpl.js +176 -0
  134. package/dist/esm/repositories/realm/contractRepository.js +116 -0
  135. package/dist/esm/repositories/realm/index.js +3 -0
  136. package/dist/esm/repositories/realm/schemas.js +105 -0
  137. package/dist/esm/repositories/realm/types.js +6 -0
  138. package/dist/esm/repositories/realm/walletRepository.js +269 -0
  139. package/dist/esm/repositories/serialization.js +40 -0
  140. package/dist/esm/repositories/sqlite/contractRepository.js +135 -0
  141. package/dist/esm/repositories/sqlite/index.js +2 -0
  142. package/dist/esm/repositories/sqlite/types.js +1 -0
  143. package/dist/esm/repositories/sqlite/walletRepository.js +324 -0
  144. package/dist/esm/repositories/walletRepository.js +1 -167
  145. package/dist/esm/script/base.js +21 -1
  146. package/dist/esm/script/delegate.js +46 -0
  147. package/dist/esm/storage/asyncStorage.js +4 -1
  148. package/dist/esm/storage/fileSystem.js +3 -0
  149. package/dist/esm/storage/inMemory.js +3 -0
  150. package/dist/esm/storage/indexedDB.js +5 -1
  151. package/dist/esm/storage/localStorage.js +3 -0
  152. package/dist/esm/utils/arkTransaction.js +15 -0
  153. package/dist/esm/utils/transactionHistory.js +50 -0
  154. package/dist/esm/wallet/asset-manager.js +333 -0
  155. package/dist/esm/wallet/asset.js +111 -0
  156. package/dist/esm/wallet/batch.js +1 -1
  157. package/dist/esm/wallet/delegator.js +231 -0
  158. package/dist/esm/wallet/expo/background.js +128 -0
  159. package/dist/esm/wallet/expo/index.js +2 -0
  160. package/dist/esm/wallet/expo/wallet.js +194 -0
  161. package/dist/esm/wallet/serviceWorker/wallet-message-handler.js +564 -0
  162. package/dist/esm/wallet/serviceWorker/wallet.js +382 -101
  163. package/dist/esm/wallet/utils.js +54 -0
  164. package/dist/esm/wallet/validation.js +139 -0
  165. package/dist/esm/wallet/vtxo-manager.js +8 -1
  166. package/dist/esm/wallet/wallet.js +704 -229
  167. package/dist/esm/worker/browser/service-worker-manager.js +76 -0
  168. package/dist/esm/{wallet/serviceWorker → worker/browser}/utils.js +2 -1
  169. package/dist/esm/worker/expo/asyncStorageTaskQueue.js +74 -0
  170. package/dist/esm/worker/expo/index.js +4 -0
  171. package/dist/esm/worker/expo/processors/contractPollProcessor.js +58 -0
  172. package/dist/esm/worker/expo/processors/index.js +1 -0
  173. package/dist/esm/worker/expo/taskQueue.js +37 -0
  174. package/dist/esm/worker/expo/taskRunner.js +54 -0
  175. package/dist/esm/worker/messageBus.js +248 -0
  176. package/dist/types/asset/assetGroup.d.ts +28 -0
  177. package/dist/types/asset/assetId.d.ts +19 -0
  178. package/dist/types/asset/assetInput.d.ts +46 -0
  179. package/dist/types/asset/assetOutput.d.ts +39 -0
  180. package/dist/types/asset/assetRef.d.ts +25 -0
  181. package/dist/types/asset/index.d.ts +8 -0
  182. package/dist/types/asset/metadata.d.ts +37 -0
  183. package/dist/types/asset/packet.d.ts +27 -0
  184. package/dist/types/asset/types.d.ts +18 -0
  185. package/dist/types/asset/utils.d.ts +21 -0
  186. package/dist/types/bip322/index.d.ts +55 -0
  187. package/dist/types/contracts/arkcontract.d.ts +101 -0
  188. package/dist/types/contracts/contractManager.d.ts +331 -0
  189. package/dist/types/contracts/contractWatcher.d.ts +192 -0
  190. package/dist/types/contracts/handlers/default.d.ts +19 -0
  191. package/dist/types/contracts/handlers/delegate.d.ts +21 -0
  192. package/dist/types/contracts/handlers/helpers.d.ts +18 -0
  193. package/dist/types/contracts/handlers/index.d.ts +7 -0
  194. package/dist/types/contracts/handlers/registry.d.ts +65 -0
  195. package/dist/types/contracts/handlers/vhtlc.d.ts +32 -0
  196. package/dist/types/contracts/index.d.ts +14 -0
  197. package/dist/types/contracts/types.d.ts +222 -0
  198. package/dist/types/forfeit.d.ts +2 -1
  199. package/dist/types/identity/index.d.ts +1 -0
  200. package/dist/types/identity/seedIdentity.d.ts +128 -0
  201. package/dist/types/index.d.ts +22 -12
  202. package/dist/types/intent/index.d.ts +15 -1
  203. package/dist/types/providers/ark.d.ts +11 -2
  204. package/dist/types/providers/delegator.d.ts +29 -0
  205. package/dist/types/providers/indexer.d.ts +11 -1
  206. package/dist/types/repositories/contractRepository.d.ts +30 -19
  207. package/dist/types/repositories/inMemory/contractRepository.d.ts +17 -0
  208. package/dist/types/repositories/inMemory/walletRepository.d.ts +26 -0
  209. package/dist/types/repositories/index.d.ts +7 -0
  210. package/dist/types/repositories/indexedDB/contractRepository.d.ts +21 -0
  211. package/dist/types/repositories/indexedDB/db.d.ts +4 -0
  212. package/dist/types/repositories/indexedDB/manager.d.ts +22 -0
  213. package/dist/types/repositories/indexedDB/schema.d.ts +8 -0
  214. package/dist/types/repositories/indexedDB/walletRepository.d.ts +25 -0
  215. package/dist/types/repositories/indexedDB/websqlAdapter.d.ts +49 -0
  216. package/dist/types/repositories/migrations/contractRepositoryImpl.d.ts +24 -0
  217. package/dist/types/repositories/migrations/fromStorageAdapter.d.ts +19 -0
  218. package/dist/types/repositories/migrations/walletRepositoryImpl.d.ts +27 -0
  219. package/dist/types/repositories/realm/contractRepository.d.ts +24 -0
  220. package/dist/types/repositories/realm/index.d.ts +4 -0
  221. package/dist/types/repositories/realm/schemas.d.ts +208 -0
  222. package/dist/types/repositories/realm/types.d.ts +16 -0
  223. package/dist/types/repositories/realm/walletRepository.d.ts +31 -0
  224. package/dist/types/repositories/serialization.d.ts +40 -0
  225. package/dist/types/repositories/sqlite/contractRepository.d.ts +33 -0
  226. package/dist/types/repositories/sqlite/index.d.ts +3 -0
  227. package/dist/types/repositories/sqlite/types.d.ts +18 -0
  228. package/dist/types/repositories/sqlite/walletRepository.d.ts +40 -0
  229. package/dist/types/repositories/walletRepository.d.ts +13 -24
  230. package/dist/types/script/base.d.ts +1 -0
  231. package/dist/types/script/delegate.d.ts +36 -0
  232. package/dist/types/storage/asyncStorage.d.ts +4 -0
  233. package/dist/types/storage/fileSystem.d.ts +3 -0
  234. package/dist/types/storage/inMemory.d.ts +3 -0
  235. package/dist/types/storage/index.d.ts +3 -0
  236. package/dist/types/storage/indexedDB.d.ts +3 -0
  237. package/dist/types/storage/localStorage.d.ts +3 -0
  238. package/dist/types/utils/arkTransaction.d.ts +6 -0
  239. package/dist/types/wallet/asset-manager.d.ts +78 -0
  240. package/dist/types/wallet/asset.d.ts +21 -0
  241. package/dist/types/wallet/batch.d.ts +1 -1
  242. package/dist/types/wallet/delegator.d.ts +24 -0
  243. package/dist/types/wallet/expo/background.d.ts +66 -0
  244. package/dist/types/wallet/expo/index.d.ts +4 -0
  245. package/dist/types/wallet/expo/wallet.d.ts +97 -0
  246. package/dist/types/wallet/index.d.ts +75 -2
  247. package/dist/types/wallet/serviceWorker/wallet-message-handler.d.ts +366 -0
  248. package/dist/types/wallet/serviceWorker/wallet.d.ts +20 -11
  249. package/dist/types/wallet/utils.d.ts +12 -1
  250. package/dist/types/wallet/validation.d.ts +24 -0
  251. package/dist/types/wallet/wallet.d.ts +111 -17
  252. package/dist/types/worker/browser/service-worker-manager.d.ts +21 -0
  253. package/dist/types/{wallet/serviceWorker → worker/browser}/utils.d.ts +2 -1
  254. package/dist/types/worker/expo/asyncStorageTaskQueue.d.ts +46 -0
  255. package/dist/types/worker/expo/index.d.ts +7 -0
  256. package/dist/types/worker/expo/processors/contractPollProcessor.d.ts +14 -0
  257. package/dist/types/worker/expo/processors/index.d.ts +1 -0
  258. package/dist/types/worker/expo/taskQueue.d.ts +50 -0
  259. package/dist/types/worker/expo/taskRunner.d.ts +42 -0
  260. package/dist/types/worker/messageBus.d.ts +109 -0
  261. package/package.json +69 -11
  262. package/dist/cjs/wallet/serviceWorker/request.js +0 -78
  263. package/dist/cjs/wallet/serviceWorker/response.js +0 -222
  264. package/dist/cjs/wallet/serviceWorker/worker.js +0 -655
  265. package/dist/esm/wallet/serviceWorker/request.js +0 -75
  266. package/dist/esm/wallet/serviceWorker/response.js +0 -219
  267. package/dist/esm/wallet/serviceWorker/worker.js +0 -651
  268. package/dist/types/wallet/serviceWorker/request.d.ts +0 -74
  269. package/dist/types/wallet/serviceWorker/response.d.ts +0 -123
  270. 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
+ }