@wormhole-foundation/sdk-algorand-tokenbridge 0.5.0-alpha.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.
@@ -0,0 +1,2 @@
1
+ export * from "./tokenBridge";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAMA,cAAc,eAAe,CAAC"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ const sdk_connect_1 = require("@wormhole-foundation/sdk-connect");
18
+ const sdk_algorand_1 = require("@wormhole-foundation/sdk-algorand");
19
+ const tokenBridge_1 = require("./tokenBridge");
20
+ (0, sdk_connect_1.registerProtocol)(sdk_algorand_1._platform, "TokenBridge", tokenBridge_1.AlgorandTokenBridge);
21
+ __exportStar(require("./tokenBridge"), exports);
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kEAAoE;AACpE,oEAA8D;AAC9D,+CAAoD;AAEpD,IAAA,8BAAgB,EAAC,wBAAS,EAAE,aAAa,EAAE,iCAAmB,CAAC,CAAC;AAEhE,gDAA8B"}
@@ -0,0 +1,46 @@
1
+ import { AccountAddress, Chain, ChainAddress, ChainId, ChainsConfig, Contracts, NativeAddress, Network, Platform, TokenAddress, TokenBridge, TokenId } from "@wormhole-foundation/sdk-connect";
2
+ import { AlgorandChains, AlgorandUnsignedTransaction, AnyAlgorandAddress } from "@wormhole-foundation/sdk-algorand";
3
+ import { AlgorandWormholeCore } from "@wormhole-foundation/sdk-algorand-core";
4
+ import { ABIMethod, Algodv2, SuggestedParams } from "algosdk";
5
+ import "@wormhole-foundation/sdk-algorand-core";
6
+ export declare const TransferMethodSelector: ABIMethod;
7
+ export declare class AlgorandTokenBridge<N extends Network, C extends AlgorandChains> implements TokenBridge<N, C> {
8
+ readonly network: N;
9
+ readonly chain: C;
10
+ readonly connection: Algodv2;
11
+ readonly contracts: Contracts;
12
+ readonly chainId: ChainId;
13
+ readonly coreBridge: AlgorandWormholeCore<N, C>;
14
+ readonly coreAppId: bigint;
15
+ readonly coreAppAddress: string;
16
+ readonly tokenBridgeAppId: bigint;
17
+ readonly tokenBridgeAddress: string;
18
+ static sendTransfer: Uint8Array;
19
+ static attestToken: Uint8Array;
20
+ static noop: Uint8Array;
21
+ static optIn: Uint8Array;
22
+ static completeTransfer: Uint8Array;
23
+ static receiveAttest: Uint8Array;
24
+ constructor(network: N, chain: C, connection: Algodv2, contracts: Contracts);
25
+ static fromRpc<N extends Network>(provider: Algodv2, config: ChainsConfig<N, Platform>): Promise<AlgorandTokenBridge<N, AlgorandChains>>;
26
+ isWrappedAsset(token: TokenAddress<C>): Promise<boolean>;
27
+ getOriginalAsset(token: TokenAddress<C>): Promise<TokenId>;
28
+ getWrappedAsset(token: TokenId<Chain>): Promise<NativeAddress<C>>;
29
+ hasWrappedAsset(token: TokenId<Chain>): Promise<boolean>;
30
+ getWrappedNative(): Promise<NativeAddress<C>>;
31
+ isTransferCompleted(vaa: TokenBridge.TransferVAA): Promise<boolean>;
32
+ createAttestation(token: TokenAddress<C>, payer?: AnyAlgorandAddress): AsyncGenerator<AlgorandUnsignedTransaction<N, C>, void, unknown>;
33
+ submitAttestation(vaa: TokenBridge.AttestVAA, sender?: AnyAlgorandAddress, suggestedParams?: SuggestedParams): AsyncGenerator<AlgorandUnsignedTransaction<N, C>>;
34
+ transfer(sender: AccountAddress<C>, recipient: ChainAddress<C>, token: TokenAddress<C>, amount: bigint, payload?: Uint8Array): AsyncGenerator<AlgorandUnsignedTransaction<N, C>>;
35
+ redeem(sender: AnyAlgorandAddress, vaa: TokenBridge.TransferVAA, unwrapNative?: boolean, suggestedParams?: SuggestedParams): AsyncGenerator<AlgorandUnsignedTransaction<N, C>, void, unknown>;
36
+ /**
37
+ * Checks if the asset has been opted in by the receiver
38
+ * @param client Algodv2 client
39
+ * @param asset Algorand asset index
40
+ * @param receiver Account address
41
+ * @returns Promise with True if the asset was opted in, False otherwise
42
+ */
43
+ static isOptedInToAsset(client: Algodv2, address: string, asset: number): Promise<boolean>;
44
+ private createUnsignedTx;
45
+ }
46
+ //# sourceMappingURL=tokenBridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenBridge.d.ts","sourceRoot":"","sources":["../../src/tokenBridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,488 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AlgorandTokenBridge = exports.TransferMethodSelector = void 0;
4
+ const sdk_connect_1 = require("@wormhole-foundation/sdk-connect");
5
+ const sdk_algorand_1 = require("@wormhole-foundation/sdk-algorand");
6
+ const sdk_algorand_core_1 = require("@wormhole-foundation/sdk-algorand-core");
7
+ const algosdk_1 = require("algosdk");
8
+ require("@wormhole-foundation/sdk-algorand-core");
9
+ exports.TransferMethodSelector = algosdk_1.ABIMethod.fromSignature("portal_transfer(byte[])byte[]");
10
+ class AlgorandTokenBridge {
11
+ network;
12
+ chain;
13
+ connection;
14
+ contracts;
15
+ chainId;
16
+ coreBridge;
17
+ coreAppId;
18
+ coreAppAddress;
19
+ tokenBridgeAppId;
20
+ tokenBridgeAddress;
21
+ static sendTransfer = sdk_connect_1.encoding.bytes.encode("sendTransfer");
22
+ static attestToken = sdk_connect_1.encoding.bytes.encode("attestToken");
23
+ static noop = sdk_connect_1.encoding.bytes.encode("nop");
24
+ static optIn = sdk_connect_1.encoding.bytes.encode("optin");
25
+ static completeTransfer = sdk_connect_1.encoding.bytes.encode("completeTransfer");
26
+ static receiveAttest = sdk_connect_1.encoding.bytes.encode("receiveAttest");
27
+ constructor(network, chain, connection, contracts) {
28
+ this.network = network;
29
+ this.chain = chain;
30
+ this.connection = connection;
31
+ this.contracts = contracts;
32
+ this.chainId = (0, sdk_connect_1.toChainId)(chain);
33
+ if (!contracts.coreBridge) {
34
+ throw new Error(`Core contract address for chain ${chain} not found`);
35
+ }
36
+ const core = BigInt(contracts.coreBridge);
37
+ this.coreAppId = core;
38
+ this.coreAppAddress = (0, algosdk_1.getApplicationAddress)(core);
39
+ this.coreBridge = new sdk_algorand_core_1.AlgorandWormholeCore(network, chain, connection, contracts);
40
+ if (!contracts.tokenBridge) {
41
+ throw new Error(`TokenBridge contract address for chain ${chain} not found`);
42
+ }
43
+ const tokenBridge = BigInt(contracts.tokenBridge);
44
+ this.tokenBridgeAppId = tokenBridge;
45
+ this.tokenBridgeAddress = (0, algosdk_1.getApplicationAddress)(tokenBridge);
46
+ }
47
+ static async fromRpc(provider, config) {
48
+ const [network, chain] = await sdk_algorand_1.AlgorandPlatform.chainFromRpc(provider);
49
+ const conf = config[chain];
50
+ if (conf.network !== network)
51
+ throw new Error(`Network mismatch: ${conf.network} != ${network}`);
52
+ return new AlgorandTokenBridge(network, chain, provider, conf.contracts);
53
+ }
54
+ // Checks a native address to see if it's a wrapped version
55
+ async isWrappedAsset(token) {
56
+ const assetId = new sdk_algorand_1.AlgorandAddress(token).toInt();
57
+ if (assetId === 0)
58
+ return false;
59
+ const assetInfoResp = await this.connection.getAssetByID(assetId).do();
60
+ const asset = algosdk_1.modelsv2.Asset.from_obj_for_encoding(assetInfoResp);
61
+ const creatorAddr = asset.params.creator;
62
+ const creatorAcctInfoResp = await this.connection
63
+ .accountInformation(creatorAddr)
64
+ .exclude("all")
65
+ .do();
66
+ const creator = algosdk_1.modelsv2.Account.from_obj_for_encoding(creatorAcctInfoResp);
67
+ const isWrapped = creator?.authAddr === this.tokenBridgeAddress;
68
+ return isWrapped;
69
+ }
70
+ // Returns the original asset with its foreign chain
71
+ async getOriginalAsset(token) {
72
+ const assetId = new sdk_algorand_1.AlgorandAddress(token).toInt();
73
+ const assetInfoResp = await this.connection.getAssetByID(assetId).do();
74
+ const assetInfo = algosdk_1.modelsv2.Asset.from_obj_for_encoding(assetInfoResp);
75
+ const decodedLocalState = await sdk_algorand_core_1.StorageLogicSig.decodeLocalState(this.connection, this.tokenBridgeAppId, assetInfo.params.creator);
76
+ if (decodedLocalState.length < 94)
77
+ throw new Error("Invalid local state data");
78
+ const chainBytes = decodedLocalState.slice(92, 94);
79
+ const chain = (0, sdk_connect_1.toChain)(sdk_connect_1.encoding.bignum.decode(chainBytes));
80
+ const address = new sdk_connect_1.UniversalAddress(decodedLocalState.slice(60, 60 + 32));
81
+ return { chain, address };
82
+ }
83
+ // Returns the address of the native version of this asset
84
+ async getWrappedAsset(token) {
85
+ const storageAccount = sdk_algorand_core_1.StorageLogicSig.forWrappedAsset(this.tokenBridgeAppId, token);
86
+ const data = await sdk_algorand_core_1.StorageLogicSig.decodeLocalState(this.connection, this.tokenBridgeAppId, storageAccount.address());
87
+ if (data.length < 8)
88
+ throw new Error("Invalid wrapped asset data");
89
+ const nativeAddress = (0, sdk_connect_1.toNative)(this.chain, sdk_connect_1.encoding.bignum.decode(data.slice(0, 8)).toString());
90
+ return nativeAddress;
91
+ }
92
+ // Checks if a wrapped version exists
93
+ async hasWrappedAsset(token) {
94
+ try {
95
+ await this.getWrappedAsset(token);
96
+ return true;
97
+ }
98
+ catch { }
99
+ return false;
100
+ }
101
+ async getWrappedNative() {
102
+ return (0, sdk_connect_1.toNative)(this.chain, "0");
103
+ }
104
+ async isTransferCompleted(vaa) {
105
+ const messageStorage = sdk_algorand_core_1.StorageLogicSig.forMessageId(this.tokenBridgeAppId, {
106
+ sequence: vaa.sequence,
107
+ chain: vaa.emitterChain,
108
+ emitter: vaa.emitterAddress,
109
+ });
110
+ try {
111
+ return await sdk_algorand_core_1.StorageLogicSig.checkBitsSet(this.connection, this.tokenBridgeAppId, messageStorage.address(), vaa.sequence);
112
+ }
113
+ catch { }
114
+ return false;
115
+ }
116
+ // Creates a Token Attestation VAA containing metadata about
117
+ // the token that may be submitted to a Token Bridge on another chain
118
+ // to allow it to create a wrapped version of the token
119
+ async *createAttestation(token, payer) {
120
+ if (!payer)
121
+ throw new Error("Payer required to create attestation");
122
+ const senderAddr = new sdk_algorand_1.AlgorandAddress(payer).toString();
123
+ const assetId = new sdk_algorand_1.AlgorandAddress(token).toInt();
124
+ const txs = [];
125
+ const suggestedParams = await this.connection.getTransactionParams().do();
126
+ const tbs = sdk_algorand_core_1.StorageLogicSig.forEmitter(this.coreAppId, new sdk_algorand_1.AlgorandAddress(this.tokenBridgeAddress).toUint8Array());
127
+ const { accounts: [emitterAddr], txs: emitterOptInTxs, } = await sdk_algorand_core_1.AlgorandWormholeCore.maybeCreateStorageTx(this.connection, senderAddr, this.coreAppId, tbs, suggestedParams);
128
+ txs.push(...emitterOptInTxs);
129
+ let creatorAddr = "";
130
+ let creatorAcctInfo;
131
+ if (assetId !== 0) {
132
+ const assetInfoResp = await this.connection.getAssetByID(assetId).do();
133
+ const assetInfo = algosdk_1.modelsv2.Asset.from_obj_for_encoding(assetInfoResp);
134
+ const creatorAcctInfoResp = await this.connection
135
+ .accountInformation(assetInfo.params.creator)
136
+ .do();
137
+ creatorAcctInfo = algosdk_1.modelsv2.Account.from_obj_for_encoding(creatorAcctInfoResp);
138
+ if (creatorAcctInfo.authAddr === this.tokenBridgeAddress.toString()) {
139
+ throw new Error("Cannot re-attest wormhole assets");
140
+ }
141
+ }
142
+ const nativeStorageAcct = sdk_algorand_core_1.StorageLogicSig.forNativeAsset(this.tokenBridgeAppId, BigInt(assetId));
143
+ const txns = await sdk_algorand_core_1.AlgorandWormholeCore.maybeCreateStorageTx(this.connection, senderAddr, this.tokenBridgeAppId, nativeStorageAcct);
144
+ creatorAddr = txns.accounts[0];
145
+ txs.push(...txns.txs);
146
+ const firstTxn = (0, algosdk_1.makeApplicationCallTxnFromObject)({
147
+ from: senderAddr,
148
+ appIndex: (0, sdk_algorand_1.safeBigIntToNumber)(this.tokenBridgeAppId),
149
+ onComplete: algosdk_1.OnApplicationComplete.NoOpOC,
150
+ appArgs: [AlgorandTokenBridge.noop],
151
+ suggestedParams,
152
+ });
153
+ txs.push({ tx: firstTxn });
154
+ const mfee = await this.coreBridge.getMessageFee();
155
+ if (mfee > BigInt(0)) {
156
+ const feeTxn = (0, algosdk_1.makePaymentTxnWithSuggestedParamsFromObject)({
157
+ from: senderAddr,
158
+ suggestedParams,
159
+ to: this.tokenBridgeAddress,
160
+ amount: mfee,
161
+ });
162
+ txs.push({ tx: feeTxn });
163
+ }
164
+ let accts = [emitterAddr, creatorAddr, this.coreAppAddress];
165
+ if (creatorAcctInfo) {
166
+ accts.push(creatorAcctInfo.address);
167
+ }
168
+ let appTxn = (0, algosdk_1.makeApplicationCallTxnFromObject)({
169
+ appArgs: [AlgorandTokenBridge.attestToken, sdk_connect_1.encoding.bignum.toBytes(assetId, 8)],
170
+ accounts: accts,
171
+ appIndex: (0, sdk_algorand_1.safeBigIntToNumber)(this.tokenBridgeAppId),
172
+ foreignApps: [(0, sdk_algorand_1.safeBigIntToNumber)(this.coreAppId)],
173
+ foreignAssets: [assetId],
174
+ from: senderAddr,
175
+ onComplete: algosdk_1.OnApplicationComplete.NoOpOC,
176
+ suggestedParams,
177
+ });
178
+ if (mfee > BigInt(0)) {
179
+ appTxn.fee *= 3;
180
+ }
181
+ else {
182
+ appTxn.fee *= 2;
183
+ }
184
+ txs.push({ tx: appTxn });
185
+ for (const utxn of txs) {
186
+ yield this.createUnsignedTx(utxn, "TokenBridge.createAttestation", true);
187
+ }
188
+ }
189
+ // Submits the Token Attestation VAA to the Token Bridge
190
+ // to create the wrapped token represented by the data in the VAA
191
+ async *submitAttestation(vaa, sender, suggestedParams) {
192
+ if (!sender)
193
+ throw new Error("Sender required to submit attestation");
194
+ if (!suggestedParams)
195
+ suggestedParams = await this.connection.getTransactionParams().do();
196
+ const senderAddr = sender.toString();
197
+ const tokenStorage = sdk_algorand_core_1.StorageLogicSig.forWrappedAsset(this.tokenBridgeAppId, vaa.payload.token);
198
+ const tokenStorageAddress = tokenStorage.address();
199
+ const txs = [];
200
+ const foreignAssets = [];
201
+ const data = await sdk_algorand_core_1.StorageLogicSig.decodeLocalState(this.connection, this.tokenBridgeAppId, tokenStorageAddress);
202
+ if (data.length > 8) {
203
+ foreignAssets.push(new sdk_algorand_1.AlgorandAddress(data.slice(0, 8)).toInt());
204
+ }
205
+ txs.push({
206
+ tx: (0, algosdk_1.makePaymentTxnWithSuggestedParamsFromObject)({
207
+ from: senderAddr,
208
+ to: tokenStorageAddress,
209
+ amount: 100000,
210
+ suggestedParams,
211
+ }),
212
+ });
213
+ let buf = new Uint8Array(1);
214
+ buf[0] = 0x01;
215
+ txs.push({
216
+ tx: (0, algosdk_1.makeApplicationCallTxnFromObject)({
217
+ appArgs: [AlgorandTokenBridge.noop, buf],
218
+ appIndex: (0, sdk_algorand_1.safeBigIntToNumber)(this.tokenBridgeAppId),
219
+ from: senderAddr,
220
+ onComplete: algosdk_1.OnApplicationComplete.NoOpOC,
221
+ suggestedParams,
222
+ }),
223
+ });
224
+ buf = new Uint8Array(1);
225
+ buf[0] = 0x02;
226
+ txs.push({
227
+ tx: (0, algosdk_1.makeApplicationCallTxnFromObject)({
228
+ appArgs: [AlgorandTokenBridge.noop, buf],
229
+ appIndex: (0, sdk_algorand_1.safeBigIntToNumber)(this.tokenBridgeAppId),
230
+ from: senderAddr,
231
+ onComplete: algosdk_1.OnApplicationComplete.NoOpOC,
232
+ suggestedParams,
233
+ }),
234
+ });
235
+ txs.push({
236
+ tx: (0, algosdk_1.makeApplicationCallTxnFromObject)({
237
+ accounts: [],
238
+ appArgs: [AlgorandTokenBridge.receiveAttest, (0, sdk_connect_1.serialize)(vaa)],
239
+ appIndex: (0, sdk_algorand_1.safeBigIntToNumber)(this.tokenBridgeAppId),
240
+ foreignAssets: foreignAssets,
241
+ from: senderAddr,
242
+ onComplete: algosdk_1.OnApplicationComplete.NoOpOC,
243
+ suggestedParams,
244
+ }),
245
+ });
246
+ txs[txs.length - 1].tx.fee = txs[txs.length - 1].tx.fee * 2;
247
+ for (const utxn of txs) {
248
+ yield this.createUnsignedTx(utxn, "TokenBridge.submitAttestation", true);
249
+ }
250
+ }
251
+ async *transfer(sender, recipient, token, amount, payload) {
252
+ const senderAddr = sender.toString();
253
+ const assetId = (0, sdk_connect_1.isNative)(token) ? 0 : new sdk_algorand_1.AlgorandAddress(token).toInt();
254
+ const qty = amount;
255
+ const chainId = (0, sdk_connect_1.toChainId)(recipient.chain);
256
+ const receiver = recipient.address.toUniversalAddress().toUint8Array();
257
+ const suggestedParams = await this.connection.getTransactionParams().do();
258
+ const fee = BigInt(0);
259
+ const tbs = sdk_algorand_core_1.StorageLogicSig.fromData({
260
+ appId: this.coreAppId,
261
+ appAddress: (0, algosdk_1.decodeAddress)(this.coreAppAddress).publicKey,
262
+ idx: BigInt(0),
263
+ address: (0, algosdk_1.decodeAddress)(this.tokenBridgeAddress).publicKey,
264
+ });
265
+ const txs = [];
266
+ const { accounts: [emitterAddr], txs: emitterOptInTxs, } = await sdk_algorand_core_1.AlgorandWormholeCore.maybeCreateStorageTx(this.connection, senderAddr, this.coreAppId, tbs, suggestedParams);
267
+ txs.push(...emitterOptInTxs);
268
+ // Check that the auth address of the creator is the token bridge
269
+ let creator = "";
270
+ let creatorAcct;
271
+ let wormhole = false;
272
+ if (assetId !== 0) {
273
+ const assetInfoResp = await this.connection.getAssetByID(assetId).do();
274
+ const asset = algosdk_1.modelsv2.Asset.from_obj_for_encoding(assetInfoResp);
275
+ creator = asset.params.creator;
276
+ const creatorAcctInfoResp = await this.connection.accountInformation(creator).do();
277
+ creatorAcct = algosdk_1.modelsv2.Account.from_obj_for_encoding(creatorAcctInfoResp);
278
+ wormhole = creatorAcct.authAddr === this.tokenBridgeAddress.toString();
279
+ }
280
+ const msgFee = await this.coreBridge.getMessageFee();
281
+ if (msgFee > 0)
282
+ txs.push({
283
+ tx: (0, algosdk_1.makePaymentTxnWithSuggestedParamsFromObject)({
284
+ from: senderAddr,
285
+ to: this.tokenBridgeAddress,
286
+ amount: msgFee,
287
+ suggestedParams,
288
+ }),
289
+ });
290
+ if (!wormhole) {
291
+ const nativeStorageAccount = sdk_algorand_core_1.StorageLogicSig.forNativeAsset(this.tokenBridgeAppId, BigInt(assetId));
292
+ const { accounts: [address], txs, } = await sdk_algorand_core_1.AlgorandWormholeCore.maybeCreateStorageTx(this.connection, senderAddr, this.tokenBridgeAppId, nativeStorageAccount, suggestedParams);
293
+ creator = address;
294
+ txs.push(...txs);
295
+ }
296
+ if (assetId !== 0 &&
297
+ !(await AlgorandTokenBridge.isOptedInToAsset(this.connection, creator, assetId))) {
298
+ // Looks like we need to optin
299
+ const payTxn = (0, algosdk_1.makePaymentTxnWithSuggestedParamsFromObject)({
300
+ from: senderAddr,
301
+ to: creator,
302
+ amount: 100000,
303
+ suggestedParams,
304
+ });
305
+ // The tokenid app needs to do the optin since it has signature authority
306
+ let txn = (0, algosdk_1.makeApplicationCallTxnFromObject)({
307
+ from: senderAddr,
308
+ appIndex: (0, sdk_algorand_1.safeBigIntToNumber)(this.tokenBridgeAppId),
309
+ onComplete: algosdk_1.OnApplicationComplete.NoOpOC,
310
+ appArgs: [AlgorandTokenBridge.optIn, (0, algosdk_1.bigIntToBytes)(assetId, 8)],
311
+ foreignAssets: [assetId],
312
+ accounts: [creator],
313
+ suggestedParams,
314
+ });
315
+ txn.fee *= 2;
316
+ txs.unshift(...[{ tx: payTxn }, { tx: txn }]);
317
+ }
318
+ const t = (0, algosdk_1.makeApplicationCallTxnFromObject)({
319
+ from: senderAddr,
320
+ appIndex: (0, sdk_algorand_1.safeBigIntToNumber)(this.tokenBridgeAppId),
321
+ onComplete: algosdk_1.OnApplicationComplete.NoOpOC,
322
+ appArgs: [AlgorandTokenBridge.noop],
323
+ suggestedParams,
324
+ });
325
+ txs.push({ tx: t });
326
+ let accounts = [];
327
+ if (assetId === 0) {
328
+ const t = (0, algosdk_1.makePaymentTxnWithSuggestedParamsFromObject)({
329
+ from: senderAddr,
330
+ to: creator,
331
+ amount: qty,
332
+ suggestedParams,
333
+ });
334
+ txs.push({ tx: t });
335
+ accounts = [emitterAddr, creator, creator];
336
+ }
337
+ else {
338
+ const t = (0, algosdk_1.makeAssetTransferTxnWithSuggestedParamsFromObject)({
339
+ from: senderAddr,
340
+ to: creator,
341
+ amount: qty,
342
+ assetIndex: assetId,
343
+ suggestedParams,
344
+ });
345
+ txs.push({ tx: t });
346
+ accounts = creatorAcct?.address
347
+ ? [emitterAddr, creator, creatorAcct.address]
348
+ : [emitterAddr, creator];
349
+ }
350
+ const args = [
351
+ AlgorandTokenBridge.sendTransfer,
352
+ sdk_connect_1.encoding.bignum.toBytes(assetId, 8),
353
+ sdk_connect_1.encoding.bignum.toBytes(qty, 8),
354
+ receiver,
355
+ sdk_connect_1.encoding.bignum.toBytes(chainId, 8),
356
+ sdk_connect_1.encoding.bignum.toBytes(fee, 8),
357
+ ];
358
+ if (payload)
359
+ args.push(payload);
360
+ const acTxn = (0, algosdk_1.makeApplicationCallTxnFromObject)({
361
+ from: senderAddr,
362
+ appIndex: (0, sdk_algorand_1.safeBigIntToNumber)(this.tokenBridgeAppId),
363
+ onComplete: algosdk_1.OnApplicationComplete.NoOpOC,
364
+ appArgs: args,
365
+ foreignApps: [(0, sdk_algorand_1.safeBigIntToNumber)(this.coreAppId)],
366
+ foreignAssets: [assetId],
367
+ accounts: accounts,
368
+ suggestedParams,
369
+ });
370
+ acTxn.fee *= 2;
371
+ txs.push({ tx: acTxn });
372
+ for (const utxn of txs) {
373
+ yield this.createUnsignedTx(utxn, "TokenBridge.transfer", true);
374
+ }
375
+ }
376
+ async *redeem(sender, vaa, unwrapNative = true, suggestedParams) {
377
+ if (!suggestedParams)
378
+ suggestedParams = await this.connection.getTransactionParams().do();
379
+ const senderAddr = new sdk_algorand_1.AlgorandAddress(sender).toString();
380
+ const { accounts, txs } = await sdk_algorand_core_1.AlgorandWormholeCore.submitVAAHeader(this.connection, this.coreAppId, this.tokenBridgeAppId, vaa, senderAddr);
381
+ // A critical routing step occurs here
382
+ let tokenStorage = undefined;
383
+ let tokenStorageAddress = "";
384
+ let foreignAssets = [];
385
+ let assetId = 0;
386
+ if (vaa.payload.token.chain !== this.chain) {
387
+ // If the token is from elsewhere we get the storage lsig for a wrapped asset
388
+ tokenStorage = sdk_algorand_core_1.StorageLogicSig.forWrappedAsset(this.tokenBridgeAppId, vaa.payload.token);
389
+ tokenStorageAddress = tokenStorage.address();
390
+ const data = await sdk_algorand_core_1.StorageLogicSig.decodeLocalState(this.connection, this.tokenBridgeAppId, tokenStorageAddress);
391
+ assetId = new sdk_algorand_1.AlgorandAddress(data.slice(0, 8)).toInt();
392
+ }
393
+ else {
394
+ // Otherwise we get the storage lsig for a native asset, including ALGO (0)
395
+ const nativeTokenId = new sdk_algorand_1.AlgorandAddress(vaa.payload.token.address).toBigInt();
396
+ tokenStorage = sdk_algorand_core_1.StorageLogicSig.forNativeAsset(this.tokenBridgeAppId, nativeTokenId);
397
+ tokenStorageAddress = tokenStorage.address();
398
+ assetId = (0, sdk_algorand_1.safeBigIntToNumber)(nativeTokenId);
399
+ }
400
+ accounts.push(tokenStorageAddress);
401
+ let appId = 0;
402
+ let receiverAddress = "";
403
+ if (vaa.payloadName === "TransferWithPayload") {
404
+ appId = new sdk_algorand_1.AlgorandAddress(vaa.payload.to.address).toInt();
405
+ receiverAddress = (0, algosdk_1.getApplicationAddress)(appId);
406
+ }
407
+ else {
408
+ receiverAddress = new sdk_algorand_1.AlgorandAddress(vaa.payload.to.address.toUint8Array()).toString();
409
+ }
410
+ accounts.push(receiverAddress);
411
+ if (assetId !== 0) {
412
+ foreignAssets.push(assetId);
413
+ if (!(await AlgorandTokenBridge.isOptedInToAsset(this.connection, receiverAddress, assetId))) {
414
+ if (senderAddr != receiverAddress) {
415
+ throw new Error("Cannot ASA optin for somebody else (asset " + assetId.toString() + ")");
416
+ }
417
+ // Push asset opt in to the front
418
+ txs.unshift({
419
+ tx: (0, algosdk_1.makeAssetTransferTxnWithSuggestedParamsFromObject)({
420
+ amount: 0,
421
+ assetIndex: assetId,
422
+ from: senderAddr,
423
+ suggestedParams,
424
+ to: senderAddr,
425
+ }),
426
+ });
427
+ }
428
+ }
429
+ const appCallObj = {
430
+ accounts: accounts,
431
+ appArgs: [AlgorandTokenBridge.completeTransfer, (0, sdk_connect_1.serialize)(vaa)],
432
+ appIndex: (0, sdk_algorand_1.safeBigIntToNumber)(this.tokenBridgeAppId),
433
+ foreignAssets: foreignAssets,
434
+ from: senderAddr,
435
+ onComplete: algosdk_1.OnApplicationComplete.NoOpOC,
436
+ suggestedParams,
437
+ };
438
+ txs.push({
439
+ tx: (0, algosdk_1.makeApplicationCallTxnFromObject)(appCallObj),
440
+ });
441
+ // We need to cover the inner transactions
442
+ txs[txs.length - 1].tx.fee =
443
+ txs[txs.length - 1].tx.fee *
444
+ (vaa.payloadName === "Transfer" && vaa.payload.fee !== undefined && vaa.payload.fee === 0n
445
+ ? 2
446
+ : 3);
447
+ if (vaa.payloadName === "TransferWithPayload") {
448
+ txs[txs.length - 1].tx.appForeignApps = [appId];
449
+ txs.push({
450
+ tx: (0, algosdk_1.makeApplicationCallTxnFromObject)({
451
+ appArgs: [
452
+ exports.TransferMethodSelector.getSelector(),
453
+ exports.TransferMethodSelector.args[0].type.encode((0, sdk_connect_1.serialize)(vaa)),
454
+ ],
455
+ appIndex: appId,
456
+ foreignAssets: foreignAssets,
457
+ from: senderAddr,
458
+ onComplete: algosdk_1.OnApplicationComplete.NoOpOC,
459
+ suggestedParams,
460
+ }),
461
+ });
462
+ }
463
+ for (const utxn of txs) {
464
+ yield this.createUnsignedTx(utxn, "TokenBridge.redeem", true);
465
+ }
466
+ }
467
+ /**
468
+ * Checks if the asset has been opted in by the receiver
469
+ * @param client Algodv2 client
470
+ * @param asset Algorand asset index
471
+ * @param receiver Account address
472
+ * @returns Promise with True if the asset was opted in, False otherwise
473
+ */
474
+ static async isOptedInToAsset(client, address, asset) {
475
+ try {
476
+ const acctInfoResp = await client.accountAssetInformation(address, asset).do();
477
+ const acctInfo = algosdk_1.modelsv2.AccountAssetResponse.from_obj_for_encoding(acctInfoResp);
478
+ return (acctInfo.assetHolding?.amount ?? 0) > 0;
479
+ }
480
+ catch { }
481
+ return false;
482
+ }
483
+ createUnsignedTx(txReq, description, parallelizable = true) {
484
+ return new sdk_algorand_1.AlgorandUnsignedTransaction(txReq, this.network, this.chain, description, parallelizable);
485
+ }
486
+ }
487
+ exports.AlgorandTokenBridge = AlgorandTokenBridge;
488
+ //# sourceMappingURL=tokenBridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenBridge.js","sourceRoot":"","sources":["../../src/tokenBridge.ts"],"names":[],"mappings":";;;AAAA,kEAoB0C;AAC1C,oEAQ2C;AAC3C,8EAA+F;AAC/F,qCAciB;AAEjB,kDAAgD;AAEnC,QAAA,sBAAsB,GAAG,mBAAS,CAAC,aAAa,CAAC,+BAA+B,CAAC,CAAC;AAE/F,MAAa,mBAAmB;IAoBnB;IACA;IACA;IACA;IApBF,OAAO,CAAU;IAEjB,UAAU,CAA6B;IACvC,SAAS,CAAS;IAClB,cAAc,CAAS;IAEvB,gBAAgB,CAAS;IACzB,kBAAkB,CAAS;IAEpC,MAAM,CAAC,YAAY,GAAG,sBAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAC5D,MAAM,CAAC,WAAW,GAAG,sBAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC1D,MAAM,CAAC,IAAI,GAAG,sBAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,CAAC,KAAK,GAAG,sBAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,CAAC,gBAAgB,GAAG,sBAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACpE,MAAM,CAAC,aAAa,GAAG,sBAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAE9D,YACW,OAAU,EACV,KAAQ,EACR,UAAmB,EACnB,SAAoB;QAHpB,YAAO,GAAP,OAAO,CAAG;QACV,UAAK,GAAL,KAAK,CAAG;QACR,eAAU,GAAV,UAAU,CAAS;QACnB,cAAS,GAAT,SAAS,CAAW;QAE7B,IAAI,CAAC,OAAO,GAAG,IAAA,uBAAS,EAAC,KAAK,CAAC,CAAC;QAEhC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;YACzB,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,YAAY,CAAC,CAAC;SACvE;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,cAAc,GAAG,IAAA,+BAAqB,EAAC,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,UAAU,GAAG,IAAI,wCAAoB,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;QAElF,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;YAC1B,MAAM,IAAI,KAAK,CAAC,0CAA0C,KAAK,YAAY,CAAC,CAAC;SAC9E;QACD,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAClD,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAC;QACpC,IAAI,CAAC,kBAAkB,GAAG,IAAA,+BAAqB,EAAC,WAAW,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAO,CAClB,QAAiB,EACjB,MAAiC;QAEjC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,+BAAgB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAEvE,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO;YAC1B,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,OAAO,OAAO,OAAO,EAAE,CAAC,CAAC;QAErE,OAAO,IAAI,mBAAmB,CAAC,OAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAChF,CAAC;IAED,2DAA2D;IAC3D,KAAK,CAAC,cAAc,CAAC,KAAsB;QACzC,MAAM,OAAO,GAAG,IAAI,8BAAe,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;QAEnD,IAAI,OAAO,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAEhC,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC;QACvE,MAAM,KAAK,GAAG,kBAAQ,CAAC,KAAK,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;QAElE,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;QACzC,MAAM,mBAAmB,GAAG,MAAM,IAAI,CAAC,UAAU;aAC9C,kBAAkB,CAAC,WAAW,CAAC;aAC/B,OAAO,CAAC,KAAK,CAAC;aACd,EAAE,EAAE,CAAC;QACR,MAAM,OAAO,GAAG,kBAAQ,CAAC,OAAO,CAAC,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;QAC5E,MAAM,SAAS,GAAY,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC,kBAAkB,CAAC;QACzE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,oDAAoD;IACpD,KAAK,CAAC,gBAAgB,CAAC,KAAsB;QAC3C,MAAM,OAAO,GAAG,IAAI,8BAAe,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;QAEnD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC;QACvE,MAAM,SAAS,GAAG,kBAAQ,CAAC,KAAK,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;QACtE,MAAM,iBAAiB,GAAG,MAAM,mCAAe,CAAC,gBAAgB,CAC9D,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,gBAAgB,EACrB,SAAS,CAAC,MAAM,CAAC,OAAO,CACzB,CAAC;QAEF,IAAI,iBAAiB,CAAC,MAAM,GAAG,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAE/E,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,IAAA,qBAAO,EAAC,sBAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,IAAI,8BAAgB,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAE3E,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC5B,CAAC;IAED,0DAA0D;IAC1D,KAAK,CAAC,eAAe,CAAC,KAAqB;QACzC,MAAM,cAAc,GAAG,mCAAe,CAAC,eAAe,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QACrF,MAAM,IAAI,GAAG,MAAM,mCAAe,CAAC,gBAAgB,CACjD,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,gBAAgB,EACrB,cAAc,CAAC,OAAO,EAAE,CACzB,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QACnE,MAAM,aAAa,GAAG,IAAA,sBAAQ,EAAC,IAAI,CAAC,KAAK,EAAE,sBAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QAChG,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,qCAAqC;IACrC,KAAK,CAAC,eAAe,CAAC,KAAqB;QACzC,IAAI;YACF,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAClC,OAAO,IAAI,CAAC;SACb;QAAC,MAAM,GAAE;QACV,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,OAAO,IAAA,sBAAQ,EAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,GAA4B;QACpD,MAAM,cAAc,GAAG,mCAAe,CAAC,YAAY,CAAC,IAAI,CAAC,gBAAgB,EAAE;YACzE,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,KAAK,EAAE,GAAG,CAAC,YAAY;YACvB,OAAO,EAAE,GAAG,CAAC,cAAc;SAC5B,CAAC,CAAC;QACH,IAAI;YACF,OAAO,MAAM,mCAAe,CAAC,YAAY,CACvC,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,gBAAgB,EACrB,cAAc,CAAC,OAAO,EAAE,EACxB,GAAG,CAAC,QAAQ,CACb,CAAC;SACH;QAAC,MAAM,GAAE;QACV,OAAO,KAAK,CAAC;IACf,CAAC;IAED,4DAA4D;IAC5D,qEAAqE;IACrE,uDAAuD;IACvD,KAAK,CAAC,CAAC,iBAAiB,CAAC,KAAsB,EAAE,KAA0B;QACzE,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAEpE,MAAM,UAAU,GAAG,IAAI,8BAAe,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;QACzD,MAAM,OAAO,GAAG,IAAI,8BAAe,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;QAEnD,MAAM,GAAG,GAA4B,EAAE,CAAC;QAExC,MAAM,eAAe,GAAoB,MAAM,IAAI,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,EAAE,EAAE,CAAC;QAE3F,MAAM,GAAG,GAAG,mCAAe,CAAC,UAAU,CACpC,IAAI,CAAC,SAAS,EACd,IAAI,8BAAe,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,YAAY,EAAE,CAC5D,CAAC;QAEF,MAAM,EACJ,QAAQ,EAAE,CAAC,WAAW,CAAC,EACvB,GAAG,EAAE,eAAe,GACrB,GAAG,MAAM,wCAAoB,CAAC,oBAAoB,CACjD,IAAI,CAAC,UAAU,EACf,UAAU,EACV,IAAI,CAAC,SAAS,EACd,GAAG,EACH,eAAe,CAChB,CAAC;QACF,GAAG,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;QAE7B,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,IAAI,eAAe,CAAC;QAEpB,IAAI,OAAO,KAAK,CAAC,EAAE;YACjB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC;YACvE,MAAM,SAAS,GAAG,kBAAQ,CAAC,KAAK,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;YACtE,MAAM,mBAAmB,GAAG,MAAM,IAAI,CAAC,UAAU;iBAC9C,kBAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC;iBAC5C,EAAE,EAAE,CAAC;YACR,eAAe,GAAG,kBAAQ,CAAC,OAAO,CAAC,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;YAC9E,IAAI,eAAe,CAAC,QAAQ,KAAK,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,EAAE;gBACnE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;aACrD;SACF;QAED,MAAM,iBAAiB,GAAG,mCAAe,CAAC,cAAc,CACtD,IAAI,CAAC,gBAAgB,EACrB,MAAM,CAAC,OAAO,CAAC,CAChB,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,wCAAoB,CAAC,oBAAoB,CAC1D,IAAI,CAAC,UAAU,EACf,UAAU,EACV,IAAI,CAAC,gBAAgB,EACrB,iBAAiB,CAClB,CAAC;QACF,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC;QAChC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QAEtB,MAAM,QAAQ,GAAG,IAAA,0CAAgC,EAAC;YAChD,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,IAAA,iCAAkB,EAAC,IAAI,CAAC,gBAAgB,CAAC;YACnD,UAAU,EAAE,+BAAqB,CAAC,MAAM;YACxC,OAAO,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC;YACnC,eAAe;SAChB,CAAC,CAAC;QACH,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAE3B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;QACnD,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE;YACpB,MAAM,MAAM,GAAG,IAAA,qDAA2C,EAAC;gBACzD,IAAI,EAAE,UAAU;gBAChB,eAAe;gBACf,EAAE,EAAE,IAAI,CAAC,kBAAkB;gBAC3B,MAAM,EAAE,IAAI;aACb,CAAC,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;SAC1B;QAED,IAAI,KAAK,GAAa,CAAC,WAAY,EAAE,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAEvE,IAAI,eAAe,EAAE;YACnB,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;SACrC;QAED,IAAI,MAAM,GAAG,IAAA,0CAAgC,EAAC;YAC5C,OAAO,EAAE,CAAC,mBAAmB,CAAC,WAAW,EAAE,sBAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC/E,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,IAAA,iCAAkB,EAAC,IAAI,CAAC,gBAAgB,CAAC;YACnD,WAAW,EAAE,CAAC,IAAA,iCAAkB,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACjD,aAAa,EAAE,CAAC,OAAO,CAAC;YACxB,IAAI,EAAE,UAAU;YAChB,UAAU,EAAE,+BAAqB,CAAC,MAAM;YACxC,eAAe;SAChB,CAAC,CAAC;QACH,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE;YACpB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;SACjB;aAAM;YACL,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;SACjB;QACD,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAEzB,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE;YACtB,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,+BAA+B,EAAE,IAAI,CAAC,CAAC;SAC1E;IACH,CAAC;IAED,wDAAwD;IACxD,iEAAiE;IACjE,KAAK,CAAC,CAAC,iBAAiB,CACtB,GAA0B,EAC1B,MAA2B,EAC3B,eAAiC;QAEjC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QACtE,IAAI,CAAC,eAAe;YAAE,eAAe,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,EAAE,EAAE,CAAC;QAE1F,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QAErC,MAAM,YAAY,GAAG,mCAAe,CAAC,eAAe,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC/F,MAAM,mBAAmB,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC;QAEnD,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,MAAM,aAAa,GAAa,EAAE,CAAC;QAEnC,MAAM,IAAI,GAAe,MAAM,mCAAe,CAAC,gBAAgB,CAC7D,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,gBAAgB,EACrB,mBAAmB,CACpB,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YACnB,aAAa,CAAC,IAAI,CAAC,IAAI,8BAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;SACnE;QAED,GAAG,CAAC,IAAI,CAAC;YACP,EAAE,EAAE,IAAA,qDAA2C,EAAC;gBAC9C,IAAI,EAAE,UAAU;gBAChB,EAAE,EAAE,mBAAmB;gBACvB,MAAM,EAAE,MAAM;gBACd,eAAe;aAChB,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,GAAG,GAAe,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;QACxC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACd,GAAG,CAAC,IAAI,CAAC;YACP,EAAE,EAAE,IAAA,0CAAgC,EAAC;gBACnC,OAAO,EAAE,CAAC,mBAAmB,CAAC,IAAI,EAAE,GAAG,CAAC;gBACxC,QAAQ,EAAE,IAAA,iCAAkB,EAAC,IAAI,CAAC,gBAAgB,CAAC;gBACnD,IAAI,EAAE,UAAU;gBAChB,UAAU,EAAE,+BAAqB,CAAC,MAAM;gBACxC,eAAe;aAChB,CAAC;SACH,CAAC,CAAC;QAEH,GAAG,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;QACxB,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACd,GAAG,CAAC,IAAI,CAAC;YACP,EAAE,EAAE,IAAA,0CAAgC,EAAC;gBACnC,OAAO,EAAE,CAAC,mBAAmB,CAAC,IAAI,EAAE,GAAG,CAAC;gBACxC,QAAQ,EAAE,IAAA,iCAAkB,EAAC,IAAI,CAAC,gBAAgB,CAAC;gBACnD,IAAI,EAAE,UAAU;gBAChB,UAAU,EAAE,+BAAqB,CAAC,MAAM;gBACxC,eAAe;aAChB,CAAC;SACH,CAAC,CAAC;QAEH,GAAG,CAAC,IAAI,CAAC;YACP,EAAE,EAAE,IAAA,0CAAgC,EAAC;gBACnC,QAAQ,EAAE,EAAE;gBACZ,OAAO,EAAE,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAA,uBAAS,EAAC,GAAG,CAAC,CAAC;gBAC5D,QAAQ,EAAE,IAAA,iCAAkB,EAAC,IAAI,CAAC,gBAAgB,CAAC;gBACnD,aAAa,EAAE,aAAa;gBAC5B,IAAI,EAAE,UAAU;gBAChB,UAAU,EAAE,+BAAqB,CAAC,MAAM;gBACxC,eAAe;aAChB,CAAC;SACH,CAAC,CAAC;QAEH,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;QAE9D,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE;YACtB,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,+BAA+B,EAAE,IAAI,CAAC,CAAC;SAC1E;IACH,CAAC;IAED,KAAK,CAAC,CAAC,QAAQ,CACb,MAAyB,EACzB,SAA0B,EAC1B,KAAsB,EACtB,MAAc,EACd,OAAoB;QAEpB,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,IAAA,sBAAQ,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,8BAAe,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;QACzE,MAAM,GAAG,GAAG,MAAM,CAAC;QACnB,MAAM,OAAO,GAAG,IAAA,uBAAS,EAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,YAAY,EAAE,CAAC;QAEvE,MAAM,eAAe,GAAoB,MAAM,IAAI,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,EAAE,EAAE,CAAC;QAE3F,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAEtB,MAAM,GAAG,GAAG,mCAAe,CAAC,QAAQ,CAAC;YACnC,KAAK,EAAE,IAAI,CAAC,SAAS;YACrB,UAAU,EAAE,IAAA,uBAAa,EAAC,IAAI,CAAC,cAAc,CAAC,CAAC,SAAS;YACxD,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;YACd,OAAO,EAAE,IAAA,uBAAa,EAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,SAAS;SAC1D,CAAC,CAAC;QAEH,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,MAAM,EACJ,QAAQ,EAAE,CAAC,WAAW,CAAC,EACvB,GAAG,EAAE,eAAe,GACrB,GAAG,MAAM,wCAAoB,CAAC,oBAAoB,CACjD,IAAI,CAAC,UAAU,EACf,UAAU,EACV,IAAI,CAAC,SAAS,EACd,GAAG,EACH,eAAe,CAChB,CAAC;QACF,GAAG,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;QAE7B,iEAAiE;QACjE,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,WAAyC,CAAC;QAC9C,IAAI,QAAQ,GAAY,KAAK,CAAC;QAC9B,IAAI,OAAO,KAAK,CAAC,EAAE;YACjB,MAAM,aAAa,GAAwB,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC;YAC5F,MAAM,KAAK,GAAG,kBAAQ,CAAC,KAAK,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;YAClE,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;YAE/B,MAAM,mBAAmB,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC;YACnF,WAAW,GAAG,kBAAQ,CAAC,OAAO,CAAC,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;YAC1E,QAAQ,GAAG,WAAW,CAAC,QAAQ,KAAK,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC;SACxE;QAED,MAAM,MAAM,GAAW,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;QAC7D,IAAI,MAAM,GAAG,CAAC;YACZ,GAAG,CAAC,IAAI,CAAC;gBACP,EAAE,EAAE,IAAA,qDAA2C,EAAC;oBAC9C,IAAI,EAAE,UAAU;oBAChB,EAAE,EAAE,IAAI,CAAC,kBAAkB;oBAC3B,MAAM,EAAE,MAAM;oBACd,eAAe;iBAChB,CAAC;aACH,CAAC,CAAC;QAEL,IAAI,CAAC,QAAQ,EAAE;YACb,MAAM,oBAAoB,GAAG,mCAAe,CAAC,cAAc,CACzD,IAAI,CAAC,gBAAgB,EACrB,MAAM,CAAC,OAAO,CAAC,CAChB,CAAC;YACF,MAAM,EACJ,QAAQ,EAAE,CAAC,OAAO,CAAC,EACnB,GAAG,GACJ,GAAG,MAAM,wCAAoB,CAAC,oBAAoB,CACjD,IAAI,CAAC,UAAU,EACf,UAAU,EACV,IAAI,CAAC,gBAAgB,EACrB,oBAAoB,EACpB,eAAe,CAChB,CAAC;YACF,OAAO,GAAG,OAAQ,CAAC;YACnB,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;SAClB;QAED,IACE,OAAO,KAAK,CAAC;YACb,CAAC,CAAC,MAAM,mBAAmB,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,EAChF;YACA,8BAA8B;YAC9B,MAAM,MAAM,GAAG,IAAA,qDAA2C,EAAC;gBACzD,IAAI,EAAE,UAAU;gBAChB,EAAE,EAAE,OAAO;gBACX,MAAM,EAAE,MAAM;gBACd,eAAe;aAChB,CAAC,CAAC;YACH,yEAAyE;YACzE,IAAI,GAAG,GAAG,IAAA,0CAAgC,EAAC;gBACzC,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,IAAA,iCAAkB,EAAC,IAAI,CAAC,gBAAgB,CAAC;gBACnD,UAAU,EAAE,+BAAqB,CAAC,MAAM;gBACxC,OAAO,EAAE,CAAC,mBAAmB,CAAC,KAAK,EAAE,IAAA,uBAAa,EAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAC/D,aAAa,EAAE,CAAC,OAAO,CAAC;gBACxB,QAAQ,EAAE,CAAC,OAAO,CAAC;gBACnB,eAAe;aAChB,CAAC,CAAC;YACH,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;YACb,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;SAC/C;QAED,MAAM,CAAC,GAAG,IAAA,0CAAgC,EAAC;YACzC,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,IAAA,iCAAkB,EAAC,IAAI,CAAC,gBAAgB,CAAC;YACnD,UAAU,EAAE,+BAAqB,CAAC,MAAM;YACxC,OAAO,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC;YACnC,eAAe;SAChB,CAAC,CAAC;QACH,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QAEpB,IAAI,QAAQ,GAAa,EAAE,CAAC;QAC5B,IAAI,OAAO,KAAK,CAAC,EAAE;YACjB,MAAM,CAAC,GAAG,IAAA,qDAA2C,EAAC;gBACpD,IAAI,EAAE,UAAU;gBAChB,EAAE,EAAE,OAAO;gBACX,MAAM,EAAE,GAAG;gBACX,eAAe;aAChB,CAAC,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;YACpB,QAAQ,GAAG,CAAC,WAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;SAC7C;aAAM;YACL,MAAM,CAAC,GAAG,IAAA,2DAAiD,EAAC;gBAC1D,IAAI,EAAE,UAAU;gBAChB,EAAE,EAAE,OAAO;gBACX,MAAM,EAAE,GAAG;gBACX,UAAU,EAAE,OAAO;gBACnB,eAAe;aAChB,CAAC,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;YACpB,QAAQ,GAAG,WAAW,EAAE,OAAO;gBAC7B,CAAC,CAAC,CAAC,WAAY,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC;gBAC9C,CAAC,CAAC,CAAC,WAAY,EAAE,OAAO,CAAC,CAAC;SAC7B;QAED,MAAM,IAAI,GAAG;YACX,mBAAmB,CAAC,YAAY;YAChC,sBAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YACnC,sBAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAC/B,QAAQ;YACR,sBAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YACnC,sBAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;SAChC,CAAC;QAEF,IAAI,OAAO;YAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEhC,MAAM,KAAK,GAAG,IAAA,0CAAgC,EAAC;YAC7C,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,IAAA,iCAAkB,EAAC,IAAI,CAAC,gBAAgB,CAAC;YACnD,UAAU,EAAE,+BAAqB,CAAC,MAAM;YACxC,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,CAAC,IAAA,iCAAkB,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACjD,aAAa,EAAE,CAAC,OAAO,CAAC;YACxB,QAAQ,EAAE,QAAQ;YAClB,eAAe;SAChB,CAAC,CAAC;QACH,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAExB,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE;YACtB,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,sBAAsB,EAAE,IAAI,CAAC,CAAC;SACjE;IACH,CAAC;IAED,KAAK,CAAC,CAAC,MAAM,CACX,MAA0B,EAC1B,GAA4B,EAC5B,eAAwB,IAAI,EAC5B,eAAiC;QAEjC,IAAI,CAAC,eAAe;YAAE,eAAe,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,EAAE,EAAE,CAAC;QAE1F,MAAM,UAAU,GAAG,IAAI,8BAAe,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;QAE1D,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,MAAM,wCAAoB,CAAC,eAAe,CAClE,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,gBAAgB,EACrB,GAAG,EACH,UAAU,CACX,CAAC;QAEF,sCAAsC;QACtC,IAAI,YAAY,GAAgC,SAAS,CAAC;QAC1D,IAAI,mBAAmB,GAAW,EAAE,CAAC;QACrC,IAAI,aAAa,GAAa,EAAE,CAAC;QACjC,IAAI,OAAO,GAAW,CAAC,CAAC;QACxB,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE;YAC1C,6EAA6E;YAC7E,YAAY,GAAG,mCAAe,CAAC,eAAe,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACzF,mBAAmB,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,MAAM,mCAAe,CAAC,gBAAgB,CACjD,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,gBAAgB,EACrB,mBAAmB,CACpB,CAAC;YACF,OAAO,GAAG,IAAI,8BAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;SACzD;aAAM;YACL,2EAA2E;YAC3E,MAAM,aAAa,GAAG,IAAI,8BAAe,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;YAChF,YAAY,GAAG,mCAAe,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;YACpF,mBAAmB,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC;YAC7C,OAAO,GAAG,IAAA,iCAAkB,EAAC,aAAa,CAAC,CAAC;SAC7C;QACD,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAEnC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,eAAe,GAAG,EAAE,CAAC;QACzB,IAAI,GAAG,CAAC,WAAW,KAAK,qBAAqB,EAAE;YAC7C,KAAK,GAAG,IAAI,8BAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;YAC5D,eAAe,GAAG,IAAA,+BAAqB,EAAC,KAAK,CAAC,CAAC;SAChD;aAAM;YACL,eAAe,GAAG,IAAI,8BAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;SACzF;QACD,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAE/B,IAAI,OAAO,KAAK,CAAC,EAAE;YACjB,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,IACE,CAAC,CAAC,MAAM,mBAAmB,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC,EACxF;gBACA,IAAI,UAAU,IAAI,eAAe,EAAE;oBACjC,MAAM,IAAI,KAAK,CAAC,4CAA4C,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,GAAG,CAAC,CAAC;iBAC1F;gBAED,iCAAiC;gBACjC,GAAG,CAAC,OAAO,CAAC;oBACV,EAAE,EAAE,IAAA,2DAAiD,EAAC;wBACpD,MAAM,EAAE,CAAC;wBACT,UAAU,EAAE,OAAO;wBACnB,IAAI,EAAE,UAAU;wBAChB,eAAe;wBACf,EAAE,EAAE,UAAU;qBACf,CAAC;iBACH,CAAC,CAAC;aACJ;SACF;QAED,MAAM,UAAU,GAAG;YACjB,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,IAAA,uBAAS,EAAC,GAAG,CAAC,CAAC;YAC/D,QAAQ,EAAE,IAAA,iCAAkB,EAAC,IAAI,CAAC,gBAAgB,CAAC;YACnD,aAAa,EAAE,aAAa;YAC5B,IAAI,EAAE,UAAU;YAChB,UAAU,EAAE,+BAAqB,CAAC,MAAM;YACxC,eAAe;SAChB,CAAC;QAEF,GAAG,CAAC,IAAI,CAAC;YACP,EAAE,EAAE,IAAA,0CAAgC,EAAC,UAAU,CAAC;SACjD,CAAC,CAAC;QAEH,0CAA0C;QAC1C,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,EAAE,CAAC,GAAG;YACzB,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,EAAE,CAAC,GAAG;gBAC3B,CAAC,GAAG,CAAC,WAAW,KAAK,UAAU,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,EAAE;oBACxF,CAAC,CAAC,CAAC;oBACH,CAAC,CAAC,CAAC,CAAC,CAAC;QAET,IAAI,GAAG,CAAC,WAAW,KAAK,qBAAqB,EAAE;YAC7C,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,EAAE,CAAC,cAAc,GAAG,CAAC,KAAK,CAAC,CAAC;YAEjD,GAAG,CAAC,IAAI,CAAC;gBACP,EAAE,EAAE,IAAA,0CAAgC,EAAC;oBACnC,OAAO,EAAE;wBACP,8BAAsB,CAAC,WAAW,EAAE;wBACnC,8BAAsB,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,IAAgB,CAAC,MAAM,CAAC,IAAA,uBAAS,EAAC,GAAG,CAAC,CAAC;qBACzE;oBACD,QAAQ,EAAE,KAAK;oBACf,aAAa,EAAE,aAAa;oBAC5B,IAAI,EAAE,UAAU;oBAChB,UAAU,EAAE,+BAAqB,CAAC,MAAM;oBACxC,eAAe;iBAChB,CAAC;aACH,CAAC,CAAC;SACJ;QAED,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE;YACtB,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,EAAE,IAAI,CAAC,CAAC;SAC/D;IACH,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAe,EAAE,OAAe,EAAE,KAAa;QAC3E,IAAI;YACF,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YAC/E,MAAM,QAAQ,GAAG,kBAAQ,CAAC,oBAAoB,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC;YACnF,OAAO,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;SACjD;QAAC,MAAM,GAAE;QACV,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,gBAAgB,CACtB,KAA4B,EAC5B,WAAmB,EACnB,iBAA0B,IAAI;QAE9B,OAAO,IAAI,0CAA2B,CACpC,KAAK,EACL,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,KAAK,EACV,WAAW,EACX,cAAc,CACf,CAAC;IACJ,CAAC;;AAhoBH,kDAioBC"}
@@ -0,0 +1,2 @@
1
+ export * from "./tokenBridge";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAMA,cAAc,eAAe,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { registerProtocol } from "@wormhole-foundation/sdk-connect";
2
+ import { _platform } from "@wormhole-foundation/sdk-algorand";
3
+ import { AlgorandTokenBridge } from "./tokenBridge";
4
+ registerProtocol(_platform, "TokenBridge", AlgorandTokenBridge);
5
+ export * from "./tokenBridge";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,gBAAgB,CAAC,SAAS,EAAE,aAAa,EAAE,mBAAmB,CAAC,CAAC;AAEhE,cAAc,eAAe,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { AccountAddress, Chain, ChainAddress, ChainId, ChainsConfig, Contracts, NativeAddress, Network, Platform, TokenAddress, TokenBridge, TokenId } from "@wormhole-foundation/sdk-connect";
2
+ import { AlgorandChains, AlgorandUnsignedTransaction, AnyAlgorandAddress } from "@wormhole-foundation/sdk-algorand";
3
+ import { AlgorandWormholeCore } from "@wormhole-foundation/sdk-algorand-core";
4
+ import { ABIMethod, Algodv2, SuggestedParams } from "algosdk";
5
+ import "@wormhole-foundation/sdk-algorand-core";
6
+ export declare const TransferMethodSelector: ABIMethod;
7
+ export declare class AlgorandTokenBridge<N extends Network, C extends AlgorandChains> implements TokenBridge<N, C> {
8
+ readonly network: N;
9
+ readonly chain: C;
10
+ readonly connection: Algodv2;
11
+ readonly contracts: Contracts;
12
+ readonly chainId: ChainId;
13
+ readonly coreBridge: AlgorandWormholeCore<N, C>;
14
+ readonly coreAppId: bigint;
15
+ readonly coreAppAddress: string;
16
+ readonly tokenBridgeAppId: bigint;
17
+ readonly tokenBridgeAddress: string;
18
+ static sendTransfer: Uint8Array;
19
+ static attestToken: Uint8Array;
20
+ static noop: Uint8Array;
21
+ static optIn: Uint8Array;
22
+ static completeTransfer: Uint8Array;
23
+ static receiveAttest: Uint8Array;
24
+ constructor(network: N, chain: C, connection: Algodv2, contracts: Contracts);
25
+ static fromRpc<N extends Network>(provider: Algodv2, config: ChainsConfig<N, Platform>): Promise<AlgorandTokenBridge<N, AlgorandChains>>;
26
+ isWrappedAsset(token: TokenAddress<C>): Promise<boolean>;
27
+ getOriginalAsset(token: TokenAddress<C>): Promise<TokenId>;
28
+ getWrappedAsset(token: TokenId<Chain>): Promise<NativeAddress<C>>;
29
+ hasWrappedAsset(token: TokenId<Chain>): Promise<boolean>;
30
+ getWrappedNative(): Promise<NativeAddress<C>>;
31
+ isTransferCompleted(vaa: TokenBridge.TransferVAA): Promise<boolean>;
32
+ createAttestation(token: TokenAddress<C>, payer?: AnyAlgorandAddress): AsyncGenerator<AlgorandUnsignedTransaction<N, C>, void, unknown>;
33
+ submitAttestation(vaa: TokenBridge.AttestVAA, sender?: AnyAlgorandAddress, suggestedParams?: SuggestedParams): AsyncGenerator<AlgorandUnsignedTransaction<N, C>>;
34
+ transfer(sender: AccountAddress<C>, recipient: ChainAddress<C>, token: TokenAddress<C>, amount: bigint, payload?: Uint8Array): AsyncGenerator<AlgorandUnsignedTransaction<N, C>>;
35
+ redeem(sender: AnyAlgorandAddress, vaa: TokenBridge.TransferVAA, unwrapNative?: boolean, suggestedParams?: SuggestedParams): AsyncGenerator<AlgorandUnsignedTransaction<N, C>, void, unknown>;
36
+ /**
37
+ * Checks if the asset has been opted in by the receiver
38
+ * @param client Algodv2 client
39
+ * @param asset Algorand asset index
40
+ * @param receiver Account address
41
+ * @returns Promise with True if the asset was opted in, False otherwise
42
+ */
43
+ static isOptedInToAsset(client: Algodv2, address: string, asset: number): Promise<boolean>;
44
+ private createUnsignedTx;
45
+ }
46
+ //# sourceMappingURL=tokenBridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenBridge.d.ts","sourceRoot":"","sources":["../../src/tokenBridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,484 @@
1
+ import { UniversalAddress, encoding, isNative, serialize, toChain, toChainId, toNative, } from "@wormhole-foundation/sdk-connect";
2
+ import { AlgorandAddress, AlgorandPlatform, AlgorandUnsignedTransaction, safeBigIntToNumber, } from "@wormhole-foundation/sdk-algorand";
3
+ import { AlgorandWormholeCore, StorageLogicSig } from "@wormhole-foundation/sdk-algorand-core";
4
+ import { ABIMethod, OnApplicationComplete, bigIntToBytes, decodeAddress, getApplicationAddress, makeApplicationCallTxnFromObject, makeAssetTransferTxnWithSuggestedParamsFromObject, makePaymentTxnWithSuggestedParamsFromObject, modelsv2, } from "algosdk";
5
+ import "@wormhole-foundation/sdk-algorand-core";
6
+ export const TransferMethodSelector = ABIMethod.fromSignature("portal_transfer(byte[])byte[]");
7
+ export class AlgorandTokenBridge {
8
+ network;
9
+ chain;
10
+ connection;
11
+ contracts;
12
+ chainId;
13
+ coreBridge;
14
+ coreAppId;
15
+ coreAppAddress;
16
+ tokenBridgeAppId;
17
+ tokenBridgeAddress;
18
+ static sendTransfer = encoding.bytes.encode("sendTransfer");
19
+ static attestToken = encoding.bytes.encode("attestToken");
20
+ static noop = encoding.bytes.encode("nop");
21
+ static optIn = encoding.bytes.encode("optin");
22
+ static completeTransfer = encoding.bytes.encode("completeTransfer");
23
+ static receiveAttest = encoding.bytes.encode("receiveAttest");
24
+ constructor(network, chain, connection, contracts) {
25
+ this.network = network;
26
+ this.chain = chain;
27
+ this.connection = connection;
28
+ this.contracts = contracts;
29
+ this.chainId = toChainId(chain);
30
+ if (!contracts.coreBridge) {
31
+ throw new Error(`Core contract address for chain ${chain} not found`);
32
+ }
33
+ const core = BigInt(contracts.coreBridge);
34
+ this.coreAppId = core;
35
+ this.coreAppAddress = getApplicationAddress(core);
36
+ this.coreBridge = new AlgorandWormholeCore(network, chain, connection, contracts);
37
+ if (!contracts.tokenBridge) {
38
+ throw new Error(`TokenBridge contract address for chain ${chain} not found`);
39
+ }
40
+ const tokenBridge = BigInt(contracts.tokenBridge);
41
+ this.tokenBridgeAppId = tokenBridge;
42
+ this.tokenBridgeAddress = getApplicationAddress(tokenBridge);
43
+ }
44
+ static async fromRpc(provider, config) {
45
+ const [network, chain] = await AlgorandPlatform.chainFromRpc(provider);
46
+ const conf = config[chain];
47
+ if (conf.network !== network)
48
+ throw new Error(`Network mismatch: ${conf.network} != ${network}`);
49
+ return new AlgorandTokenBridge(network, chain, provider, conf.contracts);
50
+ }
51
+ // Checks a native address to see if it's a wrapped version
52
+ async isWrappedAsset(token) {
53
+ const assetId = new AlgorandAddress(token).toInt();
54
+ if (assetId === 0)
55
+ return false;
56
+ const assetInfoResp = await this.connection.getAssetByID(assetId).do();
57
+ const asset = modelsv2.Asset.from_obj_for_encoding(assetInfoResp);
58
+ const creatorAddr = asset.params.creator;
59
+ const creatorAcctInfoResp = await this.connection
60
+ .accountInformation(creatorAddr)
61
+ .exclude("all")
62
+ .do();
63
+ const creator = modelsv2.Account.from_obj_for_encoding(creatorAcctInfoResp);
64
+ const isWrapped = creator?.authAddr === this.tokenBridgeAddress;
65
+ return isWrapped;
66
+ }
67
+ // Returns the original asset with its foreign chain
68
+ async getOriginalAsset(token) {
69
+ const assetId = new AlgorandAddress(token).toInt();
70
+ const assetInfoResp = await this.connection.getAssetByID(assetId).do();
71
+ const assetInfo = modelsv2.Asset.from_obj_for_encoding(assetInfoResp);
72
+ const decodedLocalState = await StorageLogicSig.decodeLocalState(this.connection, this.tokenBridgeAppId, assetInfo.params.creator);
73
+ if (decodedLocalState.length < 94)
74
+ throw new Error("Invalid local state data");
75
+ const chainBytes = decodedLocalState.slice(92, 94);
76
+ const chain = toChain(encoding.bignum.decode(chainBytes));
77
+ const address = new UniversalAddress(decodedLocalState.slice(60, 60 + 32));
78
+ return { chain, address };
79
+ }
80
+ // Returns the address of the native version of this asset
81
+ async getWrappedAsset(token) {
82
+ const storageAccount = StorageLogicSig.forWrappedAsset(this.tokenBridgeAppId, token);
83
+ const data = await StorageLogicSig.decodeLocalState(this.connection, this.tokenBridgeAppId, storageAccount.address());
84
+ if (data.length < 8)
85
+ throw new Error("Invalid wrapped asset data");
86
+ const nativeAddress = toNative(this.chain, encoding.bignum.decode(data.slice(0, 8)).toString());
87
+ return nativeAddress;
88
+ }
89
+ // Checks if a wrapped version exists
90
+ async hasWrappedAsset(token) {
91
+ try {
92
+ await this.getWrappedAsset(token);
93
+ return true;
94
+ }
95
+ catch { }
96
+ return false;
97
+ }
98
+ async getWrappedNative() {
99
+ return toNative(this.chain, "0");
100
+ }
101
+ async isTransferCompleted(vaa) {
102
+ const messageStorage = StorageLogicSig.forMessageId(this.tokenBridgeAppId, {
103
+ sequence: vaa.sequence,
104
+ chain: vaa.emitterChain,
105
+ emitter: vaa.emitterAddress,
106
+ });
107
+ try {
108
+ return await StorageLogicSig.checkBitsSet(this.connection, this.tokenBridgeAppId, messageStorage.address(), vaa.sequence);
109
+ }
110
+ catch { }
111
+ return false;
112
+ }
113
+ // Creates a Token Attestation VAA containing metadata about
114
+ // the token that may be submitted to a Token Bridge on another chain
115
+ // to allow it to create a wrapped version of the token
116
+ async *createAttestation(token, payer) {
117
+ if (!payer)
118
+ throw new Error("Payer required to create attestation");
119
+ const senderAddr = new AlgorandAddress(payer).toString();
120
+ const assetId = new AlgorandAddress(token).toInt();
121
+ const txs = [];
122
+ const suggestedParams = await this.connection.getTransactionParams().do();
123
+ const tbs = StorageLogicSig.forEmitter(this.coreAppId, new AlgorandAddress(this.tokenBridgeAddress).toUint8Array());
124
+ const { accounts: [emitterAddr], txs: emitterOptInTxs, } = await AlgorandWormholeCore.maybeCreateStorageTx(this.connection, senderAddr, this.coreAppId, tbs, suggestedParams);
125
+ txs.push(...emitterOptInTxs);
126
+ let creatorAddr = "";
127
+ let creatorAcctInfo;
128
+ if (assetId !== 0) {
129
+ const assetInfoResp = await this.connection.getAssetByID(assetId).do();
130
+ const assetInfo = modelsv2.Asset.from_obj_for_encoding(assetInfoResp);
131
+ const creatorAcctInfoResp = await this.connection
132
+ .accountInformation(assetInfo.params.creator)
133
+ .do();
134
+ creatorAcctInfo = modelsv2.Account.from_obj_for_encoding(creatorAcctInfoResp);
135
+ if (creatorAcctInfo.authAddr === this.tokenBridgeAddress.toString()) {
136
+ throw new Error("Cannot re-attest wormhole assets");
137
+ }
138
+ }
139
+ const nativeStorageAcct = StorageLogicSig.forNativeAsset(this.tokenBridgeAppId, BigInt(assetId));
140
+ const txns = await AlgorandWormholeCore.maybeCreateStorageTx(this.connection, senderAddr, this.tokenBridgeAppId, nativeStorageAcct);
141
+ creatorAddr = txns.accounts[0];
142
+ txs.push(...txns.txs);
143
+ const firstTxn = makeApplicationCallTxnFromObject({
144
+ from: senderAddr,
145
+ appIndex: safeBigIntToNumber(this.tokenBridgeAppId),
146
+ onComplete: OnApplicationComplete.NoOpOC,
147
+ appArgs: [AlgorandTokenBridge.noop],
148
+ suggestedParams,
149
+ });
150
+ txs.push({ tx: firstTxn });
151
+ const mfee = await this.coreBridge.getMessageFee();
152
+ if (mfee > BigInt(0)) {
153
+ const feeTxn = makePaymentTxnWithSuggestedParamsFromObject({
154
+ from: senderAddr,
155
+ suggestedParams,
156
+ to: this.tokenBridgeAddress,
157
+ amount: mfee,
158
+ });
159
+ txs.push({ tx: feeTxn });
160
+ }
161
+ let accts = [emitterAddr, creatorAddr, this.coreAppAddress];
162
+ if (creatorAcctInfo) {
163
+ accts.push(creatorAcctInfo.address);
164
+ }
165
+ let appTxn = makeApplicationCallTxnFromObject({
166
+ appArgs: [AlgorandTokenBridge.attestToken, encoding.bignum.toBytes(assetId, 8)],
167
+ accounts: accts,
168
+ appIndex: safeBigIntToNumber(this.tokenBridgeAppId),
169
+ foreignApps: [safeBigIntToNumber(this.coreAppId)],
170
+ foreignAssets: [assetId],
171
+ from: senderAddr,
172
+ onComplete: OnApplicationComplete.NoOpOC,
173
+ suggestedParams,
174
+ });
175
+ if (mfee > BigInt(0)) {
176
+ appTxn.fee *= 3;
177
+ }
178
+ else {
179
+ appTxn.fee *= 2;
180
+ }
181
+ txs.push({ tx: appTxn });
182
+ for (const utxn of txs) {
183
+ yield this.createUnsignedTx(utxn, "TokenBridge.createAttestation", true);
184
+ }
185
+ }
186
+ // Submits the Token Attestation VAA to the Token Bridge
187
+ // to create the wrapped token represented by the data in the VAA
188
+ async *submitAttestation(vaa, sender, suggestedParams) {
189
+ if (!sender)
190
+ throw new Error("Sender required to submit attestation");
191
+ if (!suggestedParams)
192
+ suggestedParams = await this.connection.getTransactionParams().do();
193
+ const senderAddr = sender.toString();
194
+ const tokenStorage = StorageLogicSig.forWrappedAsset(this.tokenBridgeAppId, vaa.payload.token);
195
+ const tokenStorageAddress = tokenStorage.address();
196
+ const txs = [];
197
+ const foreignAssets = [];
198
+ const data = await StorageLogicSig.decodeLocalState(this.connection, this.tokenBridgeAppId, tokenStorageAddress);
199
+ if (data.length > 8) {
200
+ foreignAssets.push(new AlgorandAddress(data.slice(0, 8)).toInt());
201
+ }
202
+ txs.push({
203
+ tx: makePaymentTxnWithSuggestedParamsFromObject({
204
+ from: senderAddr,
205
+ to: tokenStorageAddress,
206
+ amount: 100000,
207
+ suggestedParams,
208
+ }),
209
+ });
210
+ let buf = new Uint8Array(1);
211
+ buf[0] = 0x01;
212
+ txs.push({
213
+ tx: makeApplicationCallTxnFromObject({
214
+ appArgs: [AlgorandTokenBridge.noop, buf],
215
+ appIndex: safeBigIntToNumber(this.tokenBridgeAppId),
216
+ from: senderAddr,
217
+ onComplete: OnApplicationComplete.NoOpOC,
218
+ suggestedParams,
219
+ }),
220
+ });
221
+ buf = new Uint8Array(1);
222
+ buf[0] = 0x02;
223
+ txs.push({
224
+ tx: makeApplicationCallTxnFromObject({
225
+ appArgs: [AlgorandTokenBridge.noop, buf],
226
+ appIndex: safeBigIntToNumber(this.tokenBridgeAppId),
227
+ from: senderAddr,
228
+ onComplete: OnApplicationComplete.NoOpOC,
229
+ suggestedParams,
230
+ }),
231
+ });
232
+ txs.push({
233
+ tx: makeApplicationCallTxnFromObject({
234
+ accounts: [],
235
+ appArgs: [AlgorandTokenBridge.receiveAttest, serialize(vaa)],
236
+ appIndex: safeBigIntToNumber(this.tokenBridgeAppId),
237
+ foreignAssets: foreignAssets,
238
+ from: senderAddr,
239
+ onComplete: OnApplicationComplete.NoOpOC,
240
+ suggestedParams,
241
+ }),
242
+ });
243
+ txs[txs.length - 1].tx.fee = txs[txs.length - 1].tx.fee * 2;
244
+ for (const utxn of txs) {
245
+ yield this.createUnsignedTx(utxn, "TokenBridge.submitAttestation", true);
246
+ }
247
+ }
248
+ async *transfer(sender, recipient, token, amount, payload) {
249
+ const senderAddr = sender.toString();
250
+ const assetId = isNative(token) ? 0 : new AlgorandAddress(token).toInt();
251
+ const qty = amount;
252
+ const chainId = toChainId(recipient.chain);
253
+ const receiver = recipient.address.toUniversalAddress().toUint8Array();
254
+ const suggestedParams = await this.connection.getTransactionParams().do();
255
+ const fee = BigInt(0);
256
+ const tbs = StorageLogicSig.fromData({
257
+ appId: this.coreAppId,
258
+ appAddress: decodeAddress(this.coreAppAddress).publicKey,
259
+ idx: BigInt(0),
260
+ address: decodeAddress(this.tokenBridgeAddress).publicKey,
261
+ });
262
+ const txs = [];
263
+ const { accounts: [emitterAddr], txs: emitterOptInTxs, } = await AlgorandWormholeCore.maybeCreateStorageTx(this.connection, senderAddr, this.coreAppId, tbs, suggestedParams);
264
+ txs.push(...emitterOptInTxs);
265
+ // Check that the auth address of the creator is the token bridge
266
+ let creator = "";
267
+ let creatorAcct;
268
+ let wormhole = false;
269
+ if (assetId !== 0) {
270
+ const assetInfoResp = await this.connection.getAssetByID(assetId).do();
271
+ const asset = modelsv2.Asset.from_obj_for_encoding(assetInfoResp);
272
+ creator = asset.params.creator;
273
+ const creatorAcctInfoResp = await this.connection.accountInformation(creator).do();
274
+ creatorAcct = modelsv2.Account.from_obj_for_encoding(creatorAcctInfoResp);
275
+ wormhole = creatorAcct.authAddr === this.tokenBridgeAddress.toString();
276
+ }
277
+ const msgFee = await this.coreBridge.getMessageFee();
278
+ if (msgFee > 0)
279
+ txs.push({
280
+ tx: makePaymentTxnWithSuggestedParamsFromObject({
281
+ from: senderAddr,
282
+ to: this.tokenBridgeAddress,
283
+ amount: msgFee,
284
+ suggestedParams,
285
+ }),
286
+ });
287
+ if (!wormhole) {
288
+ const nativeStorageAccount = StorageLogicSig.forNativeAsset(this.tokenBridgeAppId, BigInt(assetId));
289
+ const { accounts: [address], txs, } = await AlgorandWormholeCore.maybeCreateStorageTx(this.connection, senderAddr, this.tokenBridgeAppId, nativeStorageAccount, suggestedParams);
290
+ creator = address;
291
+ txs.push(...txs);
292
+ }
293
+ if (assetId !== 0 &&
294
+ !(await AlgorandTokenBridge.isOptedInToAsset(this.connection, creator, assetId))) {
295
+ // Looks like we need to optin
296
+ const payTxn = makePaymentTxnWithSuggestedParamsFromObject({
297
+ from: senderAddr,
298
+ to: creator,
299
+ amount: 100000,
300
+ suggestedParams,
301
+ });
302
+ // The tokenid app needs to do the optin since it has signature authority
303
+ let txn = makeApplicationCallTxnFromObject({
304
+ from: senderAddr,
305
+ appIndex: safeBigIntToNumber(this.tokenBridgeAppId),
306
+ onComplete: OnApplicationComplete.NoOpOC,
307
+ appArgs: [AlgorandTokenBridge.optIn, bigIntToBytes(assetId, 8)],
308
+ foreignAssets: [assetId],
309
+ accounts: [creator],
310
+ suggestedParams,
311
+ });
312
+ txn.fee *= 2;
313
+ txs.unshift(...[{ tx: payTxn }, { tx: txn }]);
314
+ }
315
+ const t = makeApplicationCallTxnFromObject({
316
+ from: senderAddr,
317
+ appIndex: safeBigIntToNumber(this.tokenBridgeAppId),
318
+ onComplete: OnApplicationComplete.NoOpOC,
319
+ appArgs: [AlgorandTokenBridge.noop],
320
+ suggestedParams,
321
+ });
322
+ txs.push({ tx: t });
323
+ let accounts = [];
324
+ if (assetId === 0) {
325
+ const t = makePaymentTxnWithSuggestedParamsFromObject({
326
+ from: senderAddr,
327
+ to: creator,
328
+ amount: qty,
329
+ suggestedParams,
330
+ });
331
+ txs.push({ tx: t });
332
+ accounts = [emitterAddr, creator, creator];
333
+ }
334
+ else {
335
+ const t = makeAssetTransferTxnWithSuggestedParamsFromObject({
336
+ from: senderAddr,
337
+ to: creator,
338
+ amount: qty,
339
+ assetIndex: assetId,
340
+ suggestedParams,
341
+ });
342
+ txs.push({ tx: t });
343
+ accounts = creatorAcct?.address
344
+ ? [emitterAddr, creator, creatorAcct.address]
345
+ : [emitterAddr, creator];
346
+ }
347
+ const args = [
348
+ AlgorandTokenBridge.sendTransfer,
349
+ encoding.bignum.toBytes(assetId, 8),
350
+ encoding.bignum.toBytes(qty, 8),
351
+ receiver,
352
+ encoding.bignum.toBytes(chainId, 8),
353
+ encoding.bignum.toBytes(fee, 8),
354
+ ];
355
+ if (payload)
356
+ args.push(payload);
357
+ const acTxn = makeApplicationCallTxnFromObject({
358
+ from: senderAddr,
359
+ appIndex: safeBigIntToNumber(this.tokenBridgeAppId),
360
+ onComplete: OnApplicationComplete.NoOpOC,
361
+ appArgs: args,
362
+ foreignApps: [safeBigIntToNumber(this.coreAppId)],
363
+ foreignAssets: [assetId],
364
+ accounts: accounts,
365
+ suggestedParams,
366
+ });
367
+ acTxn.fee *= 2;
368
+ txs.push({ tx: acTxn });
369
+ for (const utxn of txs) {
370
+ yield this.createUnsignedTx(utxn, "TokenBridge.transfer", true);
371
+ }
372
+ }
373
+ async *redeem(sender, vaa, unwrapNative = true, suggestedParams) {
374
+ if (!suggestedParams)
375
+ suggestedParams = await this.connection.getTransactionParams().do();
376
+ const senderAddr = new AlgorandAddress(sender).toString();
377
+ const { accounts, txs } = await AlgorandWormholeCore.submitVAAHeader(this.connection, this.coreAppId, this.tokenBridgeAppId, vaa, senderAddr);
378
+ // A critical routing step occurs here
379
+ let tokenStorage = undefined;
380
+ let tokenStorageAddress = "";
381
+ let foreignAssets = [];
382
+ let assetId = 0;
383
+ if (vaa.payload.token.chain !== this.chain) {
384
+ // If the token is from elsewhere we get the storage lsig for a wrapped asset
385
+ tokenStorage = StorageLogicSig.forWrappedAsset(this.tokenBridgeAppId, vaa.payload.token);
386
+ tokenStorageAddress = tokenStorage.address();
387
+ const data = await StorageLogicSig.decodeLocalState(this.connection, this.tokenBridgeAppId, tokenStorageAddress);
388
+ assetId = new AlgorandAddress(data.slice(0, 8)).toInt();
389
+ }
390
+ else {
391
+ // Otherwise we get the storage lsig for a native asset, including ALGO (0)
392
+ const nativeTokenId = new AlgorandAddress(vaa.payload.token.address).toBigInt();
393
+ tokenStorage = StorageLogicSig.forNativeAsset(this.tokenBridgeAppId, nativeTokenId);
394
+ tokenStorageAddress = tokenStorage.address();
395
+ assetId = safeBigIntToNumber(nativeTokenId);
396
+ }
397
+ accounts.push(tokenStorageAddress);
398
+ let appId = 0;
399
+ let receiverAddress = "";
400
+ if (vaa.payloadName === "TransferWithPayload") {
401
+ appId = new AlgorandAddress(vaa.payload.to.address).toInt();
402
+ receiverAddress = getApplicationAddress(appId);
403
+ }
404
+ else {
405
+ receiverAddress = new AlgorandAddress(vaa.payload.to.address.toUint8Array()).toString();
406
+ }
407
+ accounts.push(receiverAddress);
408
+ if (assetId !== 0) {
409
+ foreignAssets.push(assetId);
410
+ if (!(await AlgorandTokenBridge.isOptedInToAsset(this.connection, receiverAddress, assetId))) {
411
+ if (senderAddr != receiverAddress) {
412
+ throw new Error("Cannot ASA optin for somebody else (asset " + assetId.toString() + ")");
413
+ }
414
+ // Push asset opt in to the front
415
+ txs.unshift({
416
+ tx: makeAssetTransferTxnWithSuggestedParamsFromObject({
417
+ amount: 0,
418
+ assetIndex: assetId,
419
+ from: senderAddr,
420
+ suggestedParams,
421
+ to: senderAddr,
422
+ }),
423
+ });
424
+ }
425
+ }
426
+ const appCallObj = {
427
+ accounts: accounts,
428
+ appArgs: [AlgorandTokenBridge.completeTransfer, serialize(vaa)],
429
+ appIndex: safeBigIntToNumber(this.tokenBridgeAppId),
430
+ foreignAssets: foreignAssets,
431
+ from: senderAddr,
432
+ onComplete: OnApplicationComplete.NoOpOC,
433
+ suggestedParams,
434
+ };
435
+ txs.push({
436
+ tx: makeApplicationCallTxnFromObject(appCallObj),
437
+ });
438
+ // We need to cover the inner transactions
439
+ txs[txs.length - 1].tx.fee =
440
+ txs[txs.length - 1].tx.fee *
441
+ (vaa.payloadName === "Transfer" && vaa.payload.fee !== undefined && vaa.payload.fee === 0n
442
+ ? 2
443
+ : 3);
444
+ if (vaa.payloadName === "TransferWithPayload") {
445
+ txs[txs.length - 1].tx.appForeignApps = [appId];
446
+ txs.push({
447
+ tx: makeApplicationCallTxnFromObject({
448
+ appArgs: [
449
+ TransferMethodSelector.getSelector(),
450
+ TransferMethodSelector.args[0].type.encode(serialize(vaa)),
451
+ ],
452
+ appIndex: appId,
453
+ foreignAssets: foreignAssets,
454
+ from: senderAddr,
455
+ onComplete: OnApplicationComplete.NoOpOC,
456
+ suggestedParams,
457
+ }),
458
+ });
459
+ }
460
+ for (const utxn of txs) {
461
+ yield this.createUnsignedTx(utxn, "TokenBridge.redeem", true);
462
+ }
463
+ }
464
+ /**
465
+ * Checks if the asset has been opted in by the receiver
466
+ * @param client Algodv2 client
467
+ * @param asset Algorand asset index
468
+ * @param receiver Account address
469
+ * @returns Promise with True if the asset was opted in, False otherwise
470
+ */
471
+ static async isOptedInToAsset(client, address, asset) {
472
+ try {
473
+ const acctInfoResp = await client.accountAssetInformation(address, asset).do();
474
+ const acctInfo = modelsv2.AccountAssetResponse.from_obj_for_encoding(acctInfoResp);
475
+ return (acctInfo.assetHolding?.amount ?? 0) > 0;
476
+ }
477
+ catch { }
478
+ return false;
479
+ }
480
+ createUnsignedTx(txReq, description, parallelizable = true) {
481
+ return new AlgorandUnsignedTransaction(txReq, this.network, this.chain, description, parallelizable);
482
+ }
483
+ }
484
+ //# sourceMappingURL=tokenBridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenBridge.js","sourceRoot":"","sources":["../../src/tokenBridge.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@wormhole-foundation/sdk-algorand-tokenbridge",
3
+ "version": "0.5.0-alpha.0",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "git+https://github.com/wormhole-foundation/connect-sdk.git"
7
+ },
8
+ "bugs": {
9
+ "url": "https://github.com/wormhole-foundation/connect-sdk/issues"
10
+ },
11
+ "homepage": "https://github.com/wormhole-foundation/connect-sdk#readme",
12
+ "directories": {
13
+ "test": "tests"
14
+ },
15
+ "license": "Apache-2.0",
16
+ "main": "./dist/cjs/index.js",
17
+ "module": "./dist/esm/index.js",
18
+ "types": "./dist/cjs/index.d.ts",
19
+ "author": "",
20
+ "description": "SDK for Algorand, used in conjunction with @wormhole-foundation/sdk",
21
+ "files": [
22
+ "dist/cjs",
23
+ "dist/esm"
24
+ ],
25
+ "keywords": [
26
+ "wormhole",
27
+ "sdk",
28
+ "typescript",
29
+ "connect",
30
+ "algorand"
31
+ ],
32
+ "engines": {
33
+ "node": ">=16"
34
+ },
35
+ "sideEffects": true,
36
+ "scripts": {
37
+ "build:cjs": "tsc -p ./tsconfig.cjs.json",
38
+ "build:esm": "tsc -p ./tsconfig.esm.json",
39
+ "build": "npm run build:cjs && npm run build:esm",
40
+ "rebuild": "npm run clean && npm run build",
41
+ "clean": "rm -rf ./dist && rm -rf ./.turbo",
42
+ "lint": "npm run prettier && eslint --fix",
43
+ "prettier": "prettier --write ./src"
44
+ },
45
+ "dependencies": {
46
+ "@wormhole-foundation/sdk-connect": "0.5.0-alpha.0",
47
+ "@wormhole-foundation/sdk-algorand": "0.5.0-alpha.0",
48
+ "@wormhole-foundation/sdk-algorand-core": "0.5.0-alpha.0"
49
+ }
50
+ }