@wormhole-foundation/sdk-algorand-tokenbridge 0.5.0-beta.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,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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"}