@wormhole-foundation/sdk-sui-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.
- package/dist/cjs/index.d.ts +3 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +23 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/tokenBridge.d.ts +29 -0
- package/dist/cjs/tokenBridge.d.ts.map +1 -0
- package/dist/cjs/tokenBridge.js +441 -0
- package/dist/cjs/tokenBridge.js.map +1 -0
- package/dist/cjs/utils.d.ts +4 -0
- package/dist/cjs/utils.d.ts.map +1 -0
- package/dist/cjs/utils.js +69 -0
- package/dist/cjs/utils.js.map +1 -0
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/tokenBridge.d.ts +29 -0
- package/dist/esm/tokenBridge.d.ts.map +1 -0
- package/dist/esm/tokenBridge.js +437 -0
- package/dist/esm/tokenBridge.js.map +1 -0
- package/dist/esm/utils.d.ts +4 -0
- package/dist/esm/utils.d.ts.map +1 -0
- package/dist/esm/utils.js +64 -0
- package/dist/esm/utils.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAMA,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
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_sui_1 = require("@wormhole-foundation/sdk-sui");
|
|
18
|
+
const sdk_connect_1 = require("@wormhole-foundation/sdk-connect");
|
|
19
|
+
const tokenBridge_1 = require("./tokenBridge");
|
|
20
|
+
(0, sdk_connect_1.registerProtocol)(sdk_sui_1._platform, "TokenBridge", tokenBridge_1.SuiTokenBridge);
|
|
21
|
+
__exportStar(require("./tokenBridge"), exports);
|
|
22
|
+
__exportStar(require("./utils"), exports);
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0DAAyD;AACzD,kEAAoE;AACpE,+CAA+C;AAE/C,IAAA,8BAAgB,EAAC,mBAAS,EAAE,aAAa,EAAE,4BAAc,CAAC,CAAC;AAE3D,gDAA8B;AAC9B,0CAAwB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { SuiClient } from "@mysten/sui.js/client";
|
|
2
|
+
import { AccountAddress, Chain, ChainAddress, ChainsConfig, Contracts, NativeAddress, Network, Platform, TokenAddress, TokenBridge, TokenId } from "@wormhole-foundation/sdk-connect";
|
|
3
|
+
import { SuiChains, SuiUnsignedTransaction } from "@wormhole-foundation/sdk-sui";
|
|
4
|
+
import "@wormhole-foundation/sdk-sui-core";
|
|
5
|
+
export declare class SuiTokenBridge<N extends Network, C extends SuiChains> implements TokenBridge<N, C> {
|
|
6
|
+
readonly network: N;
|
|
7
|
+
readonly chain: C;
|
|
8
|
+
readonly provider: SuiClient;
|
|
9
|
+
readonly contracts: Contracts;
|
|
10
|
+
readonly coreBridgeObjectId: string;
|
|
11
|
+
readonly tokenBridgeObjectId: string;
|
|
12
|
+
readonly chainId: bigint;
|
|
13
|
+
private constructor();
|
|
14
|
+
static fromRpc<N extends Network>(provider: SuiClient, config: ChainsConfig<N, Platform>): Promise<SuiTokenBridge<N, SuiChains>>;
|
|
15
|
+
isWrappedAsset(token: TokenAddress<C>): Promise<boolean>;
|
|
16
|
+
getOriginalAsset(token: TokenAddress<C>): Promise<TokenId>;
|
|
17
|
+
hasWrappedAsset(token: TokenId): Promise<boolean>;
|
|
18
|
+
getWrappedAsset(token: TokenId<Chain>): Promise<NativeAddress<C>>;
|
|
19
|
+
isTransferCompleted(vaa: TokenBridge.VAA<"Transfer" | "TransferWithPayload">): Promise<boolean>;
|
|
20
|
+
createAttestation(token: TokenAddress<C>): AsyncGenerator<SuiUnsignedTransaction<N, C>>;
|
|
21
|
+
submitAttestation(vaa: TokenBridge.VAA<"AttestMeta">, sender: AccountAddress<C>): AsyncGenerator<SuiUnsignedTransaction<N, C>>;
|
|
22
|
+
transfer(sender: AccountAddress<C>, recipient: ChainAddress, token: TokenAddress<C>, amount: bigint, payload?: Uint8Array): AsyncGenerator<SuiUnsignedTransaction<N, C>>;
|
|
23
|
+
redeem(sender: AccountAddress<C>, vaa: TokenBridge.VAA<"Transfer" | "TransferWithPayload">, unwrapNative?: boolean): AsyncGenerator<SuiUnsignedTransaction<N, C>>;
|
|
24
|
+
getWrappedNative(): Promise<NativeAddress<C>>;
|
|
25
|
+
private getPackageIds;
|
|
26
|
+
private getCoinBuildOutput;
|
|
27
|
+
private createUnsignedTx;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=tokenBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenBridge.d.ts","sourceRoot":"","sources":["../../src/tokenBridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAIlD,OAAO,EACL,cAAc,EACd,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,SAAS,EAET,aAAa,EACb,OAAO,EACP,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,OAAO,EAUR,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAGL,SAAS,EAET,sBAAsB,EAiBvB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,mCAAmC,CAAC;AAE3C,qBAAa,cAAc,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,SAAS,SAAS,CAAE,YAAW,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC;IAM5F,QAAQ,CAAC,OAAO,EAAE,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,QAAQ,CAAC,QAAQ,EAAE,SAAS;IAC5B,QAAQ,CAAC,SAAS,EAAE,SAAS;IAR/B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,OAAO;WAoBM,OAAO,CAAC,CAAC,SAAS,OAAO,EACpC,QAAQ,EAAE,SAAS,EACnB,MAAM,EAAE,YAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,GAChC,OAAO,CAAC,cAAc,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAUlC,cAAc,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IASxD,gBAAgB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IA+C1D,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAQjD,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAejE,mBAAmB,CACvB,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,UAAU,GAAG,qBAAqB,CAAC,GACvD,OAAO,CAAC,OAAO,CAAC;IA8BZ,iBAAiB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAmCvF,iBAAiB,CACtB,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,EAClC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,GACxB,cAAc,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAgGxC,QAAQ,CACb,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,EACzB,SAAS,EAAE,YAAY,EACvB,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EACtB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,UAAU,GACnB,cAAc,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAuJxC,MAAM,CACX,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,EACzB,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,UAAU,GAAG,qBAAqB,CAAC,EACxD,YAAY,GAAE,OAAc,GAC3B,cAAc,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAgDzC,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YAMrC,aAAa;YAQb,kBAAkB;IAkChC,OAAO,CAAC,gBAAgB;CAOzB"}
|
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SuiTokenBridge = void 0;
|
|
4
|
+
const transactions_1 = require("@mysten/sui.js/transactions");
|
|
5
|
+
const utils_1 = require("@mysten/sui.js/utils");
|
|
6
|
+
const sdk_connect_1 = require("@wormhole-foundation/sdk-connect");
|
|
7
|
+
const sdk_sui_1 = require("@wormhole-foundation/sdk-sui");
|
|
8
|
+
const utils_2 = require("./utils");
|
|
9
|
+
require("@wormhole-foundation/sdk-sui-core");
|
|
10
|
+
class SuiTokenBridge {
|
|
11
|
+
network;
|
|
12
|
+
chain;
|
|
13
|
+
provider;
|
|
14
|
+
contracts;
|
|
15
|
+
coreBridgeObjectId;
|
|
16
|
+
tokenBridgeObjectId;
|
|
17
|
+
chainId;
|
|
18
|
+
constructor(network, chain, provider, contracts) {
|
|
19
|
+
this.network = network;
|
|
20
|
+
this.chain = chain;
|
|
21
|
+
this.provider = provider;
|
|
22
|
+
this.contracts = contracts;
|
|
23
|
+
this.chainId = sdk_connect_1.nativeChainIds.networkChainToNativeChainId.get(network, chain);
|
|
24
|
+
const tokenBridgeAddress = this.contracts.tokenBridge;
|
|
25
|
+
if (!tokenBridgeAddress)
|
|
26
|
+
throw new Error(`Wormhole Token Bridge contract for domain ${chain} not found`);
|
|
27
|
+
const coreBridgeAddress = this.contracts.coreBridge;
|
|
28
|
+
if (!coreBridgeAddress)
|
|
29
|
+
throw new Error(`Wormhole Token Bridge contract for domain ${chain} not found`);
|
|
30
|
+
this.tokenBridgeObjectId = tokenBridgeAddress;
|
|
31
|
+
this.coreBridgeObjectId = coreBridgeAddress;
|
|
32
|
+
}
|
|
33
|
+
static async fromRpc(provider, config) {
|
|
34
|
+
const [network, chain] = await sdk_sui_1.SuiPlatform.chainFromRpc(provider);
|
|
35
|
+
const conf = config[chain];
|
|
36
|
+
if (conf.network !== network)
|
|
37
|
+
throw new Error(`Network mismatch: ${conf.network} != ${network}`);
|
|
38
|
+
return new SuiTokenBridge(network, chain, provider, conf.contracts);
|
|
39
|
+
}
|
|
40
|
+
async isWrappedAsset(token) {
|
|
41
|
+
try {
|
|
42
|
+
await this.getOriginalAsset(token);
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async getOriginalAsset(token) {
|
|
50
|
+
let coinType = token.getCoinType();
|
|
51
|
+
if (!(0, sdk_sui_1.isValidSuiType)(coinType))
|
|
52
|
+
throw new Error(`Invalid Sui type: ${coinType}`);
|
|
53
|
+
const res = await (0, utils_2.getTokenFromTokenRegistry)(this.provider, this.tokenBridgeObjectId, coinType);
|
|
54
|
+
const fields = (0, sdk_sui_1.getFieldsFromObjectResponse)(res);
|
|
55
|
+
if (!fields)
|
|
56
|
+
throw (0, sdk_connect_1.ErrNotWrapped)(coinType);
|
|
57
|
+
if (!(0, sdk_sui_1.isMoveStructObject)(fields))
|
|
58
|
+
throw new Error("Expected fields to be a MoveStruct");
|
|
59
|
+
if (!("value" in fields))
|
|
60
|
+
throw new Error("Expected a `value` key in fields of MoveStruct");
|
|
61
|
+
const val = fields["value"];
|
|
62
|
+
if (!(0, sdk_sui_1.isMoveStructStruct)(val))
|
|
63
|
+
throw new Error("Expected fields to be a MoveStruct");
|
|
64
|
+
// Normalize types
|
|
65
|
+
const type = (0, sdk_sui_1.trimSuiType)(val.type);
|
|
66
|
+
coinType = (0, sdk_sui_1.trimSuiType)(coinType);
|
|
67
|
+
// Check if wrapped or native asset. We check inclusion instead of equality
|
|
68
|
+
// because it saves us from making an additional RPC call to fetch the package ID.
|
|
69
|
+
if (type.includes(`wrapped_asset::WrappedAsset<${coinType}>`)) {
|
|
70
|
+
const info = val.fields["info"];
|
|
71
|
+
if (!(0, sdk_sui_1.isMoveStructStruct)(info))
|
|
72
|
+
throw new Error("Expected fields to be a MoveStruct");
|
|
73
|
+
const address = info.fields["token_address"];
|
|
74
|
+
if (!(0, sdk_sui_1.isMoveStructStruct)(address))
|
|
75
|
+
throw new Error("Expected fields to be a MoveStruct");
|
|
76
|
+
if (!(0, sdk_sui_1.isMoveStructObject)(address.fields))
|
|
77
|
+
throw new Error("Expected address data to be a MoveObject");
|
|
78
|
+
if (!("value" in address.fields))
|
|
79
|
+
throw new Error("Expected a `value` key in fields of MoveStruct");
|
|
80
|
+
const addressVal = address.fields["value"];
|
|
81
|
+
if (!(0, sdk_sui_1.isMoveStructStruct)(addressVal))
|
|
82
|
+
throw new Error("Expected fields to be a MoveStruct");
|
|
83
|
+
return {
|
|
84
|
+
chain: (0, sdk_connect_1.toChain)(Number(info.fields["token_chain"])),
|
|
85
|
+
// @ts-ignore TODO
|
|
86
|
+
address: new sdk_connect_1.UniversalAddress(addressVal.fields["data"]),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
throw (0, sdk_connect_1.ErrNotWrapped)(coinType);
|
|
90
|
+
}
|
|
91
|
+
async hasWrappedAsset(token) {
|
|
92
|
+
try {
|
|
93
|
+
await this.getWrappedAsset(token);
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
catch (e) { }
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
async getWrappedAsset(token) {
|
|
100
|
+
if ((0, sdk_connect_1.isNative)(token.address))
|
|
101
|
+
throw new Error("Token Address required, 'native' literal not supported");
|
|
102
|
+
const address = await (0, utils_2.getTokenCoinType)(this.provider, this.tokenBridgeObjectId, token.address.toUniversalAddress().toUint8Array(), (0, sdk_connect_1.toChainId)(token.chain));
|
|
103
|
+
if (!address)
|
|
104
|
+
throw (0, sdk_connect_1.ErrNotWrapped)((0, sdk_connect_1.canonicalAddress)(token));
|
|
105
|
+
return (0, sdk_connect_1.toNative)(this.chain, address);
|
|
106
|
+
}
|
|
107
|
+
async isTransferCompleted(vaa) {
|
|
108
|
+
const tokenBridgeStateFields = await (0, sdk_sui_1.getObjectFields)(this.provider, this.tokenBridgeObjectId);
|
|
109
|
+
if (!tokenBridgeStateFields)
|
|
110
|
+
throw new Error("Unable to fetch object fields from token bridge state");
|
|
111
|
+
const hashes = tokenBridgeStateFields["consumed_vaas"]?.fields?.hashes;
|
|
112
|
+
const keyType = (0, sdk_sui_1.getTableKeyType)(hashes?.fields?.items?.type);
|
|
113
|
+
if (!keyType)
|
|
114
|
+
throw new Error("Unable to get key type");
|
|
115
|
+
const tableObjectId = hashes?.fields?.items?.fields?.id?.id;
|
|
116
|
+
if (!tableObjectId)
|
|
117
|
+
throw new Error("Unable to fetch consumed VAAs table");
|
|
118
|
+
const response = await this.provider.getDynamicFieldObject({
|
|
119
|
+
parentId: tableObjectId,
|
|
120
|
+
name: {
|
|
121
|
+
type: keyType,
|
|
122
|
+
value: {
|
|
123
|
+
data: [...vaa.hash],
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
if (!response.error)
|
|
128
|
+
return true;
|
|
129
|
+
if (response.error.code === "dynamicFieldNotFound")
|
|
130
|
+
return false;
|
|
131
|
+
throw new Error(`Unexpected getDynamicFieldObject response ${response.error}`);
|
|
132
|
+
}
|
|
133
|
+
async *createAttestation(token) {
|
|
134
|
+
const feeAmount = 0n;
|
|
135
|
+
const nonce = 0n;
|
|
136
|
+
const coinType = token.toString();
|
|
137
|
+
const metadata = await this.provider.getCoinMetadata({ coinType });
|
|
138
|
+
if (metadata === null || metadata.id === null)
|
|
139
|
+
throw new Error(`Coin metadata ID for type ${coinType} not found`);
|
|
140
|
+
const [coreBridgePackageId, tokenBridgePackageId] = await this.getPackageIds();
|
|
141
|
+
const tx = new transactions_1.TransactionBlock();
|
|
142
|
+
const [feeCoin] = tx.splitCoins(tx.gas, [tx.pure(feeAmount)]);
|
|
143
|
+
const [messageTicket] = tx.moveCall({
|
|
144
|
+
target: `${tokenBridgePackageId}::attest_token::attest_token`,
|
|
145
|
+
arguments: [tx.object(this.tokenBridgeObjectId), tx.object(metadata.id), tx.pure(nonce)],
|
|
146
|
+
typeArguments: [coinType],
|
|
147
|
+
});
|
|
148
|
+
tx.moveCall({
|
|
149
|
+
target: `${coreBridgePackageId}::publish_message::publish_message`,
|
|
150
|
+
arguments: [
|
|
151
|
+
tx.object(this.coreBridgeObjectId),
|
|
152
|
+
feeCoin,
|
|
153
|
+
messageTicket,
|
|
154
|
+
tx.object(utils_1.SUI_CLOCK_OBJECT_ID),
|
|
155
|
+
],
|
|
156
|
+
});
|
|
157
|
+
yield this.createUnsignedTx(tx, "Sui.TokenBridge.CreateAttestation");
|
|
158
|
+
}
|
|
159
|
+
async *submitAttestation(vaa, sender) {
|
|
160
|
+
const [coreBridgePackageId, tokenBridgePackageId] = await this.getPackageIds();
|
|
161
|
+
const senderAddress = sender.toString();
|
|
162
|
+
const decimals = Math.min(vaa.payload.decimals, 8);
|
|
163
|
+
const build = await this.getCoinBuildOutput(coreBridgePackageId, tokenBridgePackageId, decimals);
|
|
164
|
+
const publishTx = await (0, sdk_sui_1.publishPackage)(build, senderAddress);
|
|
165
|
+
yield this.createUnsignedTx(publishTx, "Sui.TokenBridge.PrepareCreateWrapped");
|
|
166
|
+
// TODO: refactor this to something less embarassing
|
|
167
|
+
let coinPackageId = "";
|
|
168
|
+
let wrappedSetupObjectId = "";
|
|
169
|
+
let coinUpgradeCapId = "";
|
|
170
|
+
let coinMetadataObjectId = "";
|
|
171
|
+
let versionType = "";
|
|
172
|
+
let found = false;
|
|
173
|
+
while (!found) {
|
|
174
|
+
// wait for the result of the previous tx to fetch the new coinPackageId
|
|
175
|
+
await new Promise((r) => setTimeout(r, 500));
|
|
176
|
+
const txBlocks = await this.provider.queryTransactionBlocks({
|
|
177
|
+
filter: { FromAddress: senderAddress },
|
|
178
|
+
options: { showObjectChanges: true },
|
|
179
|
+
limit: 3,
|
|
180
|
+
});
|
|
181
|
+
// Find the txblock with both the coinPackageId and wrappedType
|
|
182
|
+
for (const txb of txBlocks.data) {
|
|
183
|
+
if (!("objectChanges" in txb))
|
|
184
|
+
continue;
|
|
185
|
+
for (const change of txb.objectChanges) {
|
|
186
|
+
if ((0, sdk_sui_1.isSuiPublishEvent)(change) && change.packageId !== undefined) {
|
|
187
|
+
coinPackageId = change.packageId;
|
|
188
|
+
}
|
|
189
|
+
else if ((0, sdk_sui_1.isSuiCreateEvent)(change) && change.objectType.includes("WrappedAssetSetup")) {
|
|
190
|
+
wrappedSetupObjectId = change.objectId;
|
|
191
|
+
// TODO: what
|
|
192
|
+
versionType = change.objectType.split(", ")[1].replace(">", ""); // ugh
|
|
193
|
+
}
|
|
194
|
+
else if ((0, sdk_sui_1.isSuiCreateEvent)(change) && change.objectType.includes("UpgradeCap")) {
|
|
195
|
+
coinUpgradeCapId = change.objectId;
|
|
196
|
+
}
|
|
197
|
+
else if ((0, sdk_sui_1.isSuiCreateEvent)(change) && change.objectType.includes("CoinMetadata")) {
|
|
198
|
+
coinMetadataObjectId = change.objectId;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (coinPackageId !== "" &&
|
|
202
|
+
wrappedSetupObjectId !== "" &&
|
|
203
|
+
coinUpgradeCapId !== "" &&
|
|
204
|
+
coinMetadataObjectId !== "") {
|
|
205
|
+
found = true;
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
coinPackageId = "";
|
|
210
|
+
wrappedSetupObjectId = "";
|
|
211
|
+
coinUpgradeCapId = "";
|
|
212
|
+
coinMetadataObjectId = "";
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
const coinType = (0, sdk_sui_1.getCoinTypeFromPackageId)(coinPackageId);
|
|
217
|
+
const createTx = new transactions_1.TransactionBlock();
|
|
218
|
+
const [txVaa] = createTx.moveCall({
|
|
219
|
+
target: `${coreBridgePackageId}::vaa::parse_and_verify`,
|
|
220
|
+
arguments: [
|
|
221
|
+
createTx.object(this.coreBridgeObjectId),
|
|
222
|
+
createTx.pure((0, sdk_sui_1.uint8ArrayToBCS)((0, sdk_connect_1.serialize)(vaa))),
|
|
223
|
+
createTx.object(utils_1.SUI_CLOCK_OBJECT_ID),
|
|
224
|
+
],
|
|
225
|
+
});
|
|
226
|
+
const [message] = createTx.moveCall({
|
|
227
|
+
target: `${tokenBridgePackageId}::vaa::verify_only_once`,
|
|
228
|
+
arguments: [createTx.object(this.tokenBridgeObjectId), txVaa],
|
|
229
|
+
});
|
|
230
|
+
createTx.moveCall({
|
|
231
|
+
target: `${tokenBridgePackageId}::create_wrapped::complete_registration`,
|
|
232
|
+
arguments: [
|
|
233
|
+
createTx.object(this.tokenBridgeObjectId),
|
|
234
|
+
createTx.object(coinMetadataObjectId),
|
|
235
|
+
createTx.object(wrappedSetupObjectId),
|
|
236
|
+
createTx.object(coinUpgradeCapId),
|
|
237
|
+
message,
|
|
238
|
+
],
|
|
239
|
+
typeArguments: [coinType, versionType],
|
|
240
|
+
});
|
|
241
|
+
yield this.createUnsignedTx(createTx, "Sui.TokenBridge.SubmitAttestation");
|
|
242
|
+
}
|
|
243
|
+
async *transfer(sender, recipient, token, amount, payload) {
|
|
244
|
+
// TODO:
|
|
245
|
+
const feeAmount = 0n;
|
|
246
|
+
const relayerFee = 0n;
|
|
247
|
+
const nonce = 0;
|
|
248
|
+
const senderAddress = sender.toString();
|
|
249
|
+
const coinType = ((0, sdk_connect_1.isNative)(token) ? utils_1.SUI_TYPE_ARG : token).toString();
|
|
250
|
+
const coins = (await this.provider.getCoins({
|
|
251
|
+
owner: senderAddress,
|
|
252
|
+
coinType,
|
|
253
|
+
})).data;
|
|
254
|
+
const [primaryCoin, ...mergeCoins] = coins.filter((coin) => (0, sdk_sui_1.isSameType)(coin.coinType, coinType));
|
|
255
|
+
if (primaryCoin === undefined)
|
|
256
|
+
throw new Error(`Coins array doesn't contain any coins of type ${coinType}`);
|
|
257
|
+
const [coreBridgePackageId, tokenBridgePackageId] = await this.getPackageIds();
|
|
258
|
+
const tx = new transactions_1.TransactionBlock();
|
|
259
|
+
const [transferCoin] = (() => {
|
|
260
|
+
if (coinType === utils_1.SUI_TYPE_ARG) {
|
|
261
|
+
return tx.splitCoins(tx.gas, [tx.pure(amount)]);
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
const primaryCoinInput = tx.object(primaryCoin.coinObjectId);
|
|
265
|
+
if (mergeCoins.length) {
|
|
266
|
+
tx.mergeCoins(primaryCoinInput, mergeCoins.map((coin) => tx.object(coin.coinObjectId)));
|
|
267
|
+
}
|
|
268
|
+
return tx.splitCoins(primaryCoinInput, [tx.pure(amount)]);
|
|
269
|
+
}
|
|
270
|
+
})();
|
|
271
|
+
const [feeCoin] = tx.splitCoins(tx.gas, [tx.pure(feeAmount)]);
|
|
272
|
+
const [assetInfo] = tx.moveCall({
|
|
273
|
+
target: `${tokenBridgePackageId}::state::verified_asset`,
|
|
274
|
+
arguments: [tx.object(this.tokenBridgeObjectId)],
|
|
275
|
+
typeArguments: [coinType],
|
|
276
|
+
});
|
|
277
|
+
if (!payload) {
|
|
278
|
+
const [transferTicket, dust] = tx.moveCall({
|
|
279
|
+
target: `${tokenBridgePackageId}::transfer_tokens::prepare_transfer`,
|
|
280
|
+
arguments: [
|
|
281
|
+
assetInfo,
|
|
282
|
+
transferCoin,
|
|
283
|
+
tx.pure((0, sdk_connect_1.toChainId)(recipient.chain)),
|
|
284
|
+
tx.pure((0, sdk_sui_1.uint8ArrayToBCS)(recipient.address.toUint8Array())),
|
|
285
|
+
tx.pure(relayerFee),
|
|
286
|
+
tx.pure(nonce),
|
|
287
|
+
],
|
|
288
|
+
typeArguments: [coinType],
|
|
289
|
+
});
|
|
290
|
+
tx.moveCall({
|
|
291
|
+
target: `${tokenBridgePackageId}::coin_utils::return_nonzero`,
|
|
292
|
+
arguments: [dust],
|
|
293
|
+
typeArguments: [coinType],
|
|
294
|
+
});
|
|
295
|
+
const [messageTicket] = tx.moveCall({
|
|
296
|
+
target: `${tokenBridgePackageId}::transfer_tokens::transfer_tokens`,
|
|
297
|
+
arguments: [tx.object(this.tokenBridgeObjectId), transferTicket],
|
|
298
|
+
typeArguments: [coinType],
|
|
299
|
+
});
|
|
300
|
+
tx.moveCall({
|
|
301
|
+
target: `${coreBridgePackageId}::publish_message::publish_message`,
|
|
302
|
+
arguments: [
|
|
303
|
+
tx.object(this.coreBridgeObjectId),
|
|
304
|
+
feeCoin,
|
|
305
|
+
messageTicket,
|
|
306
|
+
tx.object(utils_1.SUI_CLOCK_OBJECT_ID),
|
|
307
|
+
],
|
|
308
|
+
});
|
|
309
|
+
yield this.createUnsignedTx(tx, "Sui.TokenBridge.Transfer");
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
if (!senderAddress)
|
|
313
|
+
throw new Error("senderAddress is required for transfer with payload");
|
|
314
|
+
// Get or create a new `EmitterCap`
|
|
315
|
+
let isNewEmitterCap = false;
|
|
316
|
+
const emitterCap = await (async () => {
|
|
317
|
+
const objectId = await (0, sdk_sui_1.getOldestEmitterCapObjectId)(this.provider, coreBridgePackageId, senderAddress);
|
|
318
|
+
if (objectId !== null) {
|
|
319
|
+
return tx.object(objectId);
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
const [emitterCap] = tx.moveCall({
|
|
323
|
+
target: `${coreBridgePackageId}::emitter::new`,
|
|
324
|
+
arguments: [tx.object(this.coreBridgeObjectId)],
|
|
325
|
+
});
|
|
326
|
+
isNewEmitterCap = true;
|
|
327
|
+
return emitterCap;
|
|
328
|
+
}
|
|
329
|
+
})();
|
|
330
|
+
const [transferTicket, dust] = tx.moveCall({
|
|
331
|
+
target: `${tokenBridgePackageId}::transfer_tokens_with_payload::prepare_transfer`,
|
|
332
|
+
arguments: [
|
|
333
|
+
emitterCap,
|
|
334
|
+
assetInfo,
|
|
335
|
+
transferCoin,
|
|
336
|
+
tx.pure((0, sdk_connect_1.toChainId)(recipient.chain)),
|
|
337
|
+
tx.pure(recipient.address.toUint8Array()),
|
|
338
|
+
tx.pure([...payload]),
|
|
339
|
+
tx.pure(nonce),
|
|
340
|
+
],
|
|
341
|
+
typeArguments: [coinType],
|
|
342
|
+
});
|
|
343
|
+
tx.moveCall({
|
|
344
|
+
target: `${tokenBridgePackageId}::coin_utils::return_nonzero`,
|
|
345
|
+
arguments: [dust],
|
|
346
|
+
typeArguments: [coinType],
|
|
347
|
+
});
|
|
348
|
+
const [messageTicket] = tx.moveCall({
|
|
349
|
+
target: `${tokenBridgePackageId}::transfer_tokens_with_payload::transfer_tokens_with_payload`,
|
|
350
|
+
arguments: [tx.object(this.tokenBridgeObjectId), transferTicket],
|
|
351
|
+
typeArguments: [coinType],
|
|
352
|
+
});
|
|
353
|
+
tx.moveCall({
|
|
354
|
+
target: `${coreBridgePackageId}::publish_message::publish_message`,
|
|
355
|
+
arguments: [
|
|
356
|
+
tx.object(this.coreBridgeObjectId),
|
|
357
|
+
feeCoin,
|
|
358
|
+
messageTicket,
|
|
359
|
+
tx.object(utils_1.SUI_CLOCK_OBJECT_ID),
|
|
360
|
+
],
|
|
361
|
+
});
|
|
362
|
+
if (isNewEmitterCap) {
|
|
363
|
+
tx.transferObjects([emitterCap], tx.pure(senderAddress));
|
|
364
|
+
}
|
|
365
|
+
yield this.createUnsignedTx(tx, "Sui.TokenBridge.TransferWithPayload");
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
async *redeem(sender, vaa, unwrapNative = true) {
|
|
369
|
+
const coinType = await (0, utils_2.getTokenCoinType)(this.provider, this.tokenBridgeObjectId, vaa.payload.token.address.toUint8Array(), (0, sdk_connect_1.toChainId)(vaa.payload.token.chain));
|
|
370
|
+
if (!coinType) {
|
|
371
|
+
throw new Error("Unable to fetch token coinType");
|
|
372
|
+
}
|
|
373
|
+
const [coreBridgePackageId, tokenBridgePackageId] = await this.getPackageIds();
|
|
374
|
+
const tx = new transactions_1.TransactionBlock();
|
|
375
|
+
const [verifiedVAA] = tx.moveCall({
|
|
376
|
+
target: `${coreBridgePackageId}::vaa::parse_and_verify`,
|
|
377
|
+
arguments: [
|
|
378
|
+
tx.object(this.coreBridgeObjectId),
|
|
379
|
+
tx.pure((0, sdk_sui_1.uint8ArrayToBCS)((0, sdk_connect_1.serialize)(vaa))),
|
|
380
|
+
tx.object(utils_1.SUI_CLOCK_OBJECT_ID),
|
|
381
|
+
],
|
|
382
|
+
});
|
|
383
|
+
const [tokenBridgeMessage] = tx.moveCall({
|
|
384
|
+
target: `${tokenBridgePackageId}::vaa::verify_only_once`,
|
|
385
|
+
arguments: [tx.object(this.tokenBridgeObjectId), verifiedVAA],
|
|
386
|
+
});
|
|
387
|
+
const [relayerReceipt] = tx.moveCall({
|
|
388
|
+
target: `${tokenBridgePackageId}::complete_transfer::authorize_transfer`,
|
|
389
|
+
arguments: [tx.object(this.tokenBridgeObjectId), tokenBridgeMessage],
|
|
390
|
+
typeArguments: [coinType],
|
|
391
|
+
});
|
|
392
|
+
const [coins] = tx.moveCall({
|
|
393
|
+
target: `${tokenBridgePackageId}::complete_transfer::redeem_relayer_payout`,
|
|
394
|
+
arguments: [relayerReceipt],
|
|
395
|
+
typeArguments: [coinType],
|
|
396
|
+
});
|
|
397
|
+
tx.moveCall({
|
|
398
|
+
target: `${tokenBridgePackageId}::coin_utils::return_nonzero`,
|
|
399
|
+
arguments: [coins],
|
|
400
|
+
typeArguments: [coinType],
|
|
401
|
+
});
|
|
402
|
+
yield this.createUnsignedTx(tx, "Sui.TokenBridge.Redeem");
|
|
403
|
+
}
|
|
404
|
+
async getWrappedNative() {
|
|
405
|
+
const md = await this.provider.getCoinMetadata({ coinType: utils_1.SUI_TYPE_ARG });
|
|
406
|
+
if (!md)
|
|
407
|
+
throw new Error("Coin metadata not found");
|
|
408
|
+
return (0, sdk_connect_1.toNative)(this.chain, md.id);
|
|
409
|
+
}
|
|
410
|
+
async getPackageIds() {
|
|
411
|
+
// TODO: can these be cached?
|
|
412
|
+
return Promise.all([
|
|
413
|
+
(0, sdk_sui_1.getPackageId)(this.provider, this.coreBridgeObjectId),
|
|
414
|
+
(0, sdk_sui_1.getPackageId)(this.provider, this.tokenBridgeObjectId),
|
|
415
|
+
]);
|
|
416
|
+
}
|
|
417
|
+
async getCoinBuildOutput(coreBridgePackageId, tokenBridgePackageId, decimals) {
|
|
418
|
+
if (decimals > 8)
|
|
419
|
+
throw new Error("Decimals is capped at 8");
|
|
420
|
+
// Construct bytecode, parametrized by token bridge package ID and decimals
|
|
421
|
+
const strippedTokenBridgePackageId = (await (0, sdk_sui_1.getOriginalPackageId)(this.provider, this.tokenBridgeObjectId))?.replace("0x", "");
|
|
422
|
+
if (!strippedTokenBridgePackageId) {
|
|
423
|
+
throw new Error(`Original token bridge package ID not found for object ID ${this.tokenBridgeObjectId}`);
|
|
424
|
+
}
|
|
425
|
+
const bytecodeHex = "a11ceb0b060000000901000a020a14031e1704350405392d07669f01088502600ae502050cea02160004010b010c0205020d000002000201020003030c020001000104020700000700010001090801010c020a050600030803040202000302010702080007080100020800080303090002070801010b020209000901010608010105010b0202080008030209000504434f494e095478436f6e7465787408565f5f305f325f3011577261707065644173736574536574757004636f696e0e6372656174655f777261707065640b64756d6d795f6669656c6404696e697414707265706172655f726567697374726174696f6e0f7075626c69635f7472616e736665720673656e646572087472616e736665720a74785f636f6e746578740f76657273696f6e5f636f6e74726f6c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002" +
|
|
426
|
+
strippedTokenBridgePackageId +
|
|
427
|
+
"00020106010000000001090b0031" +
|
|
428
|
+
decimals.toString(16).padStart(2, "0") +
|
|
429
|
+
"0a0138000b012e110238010200";
|
|
430
|
+
const bytecode = sdk_connect_1.encoding.b64.encode(sdk_connect_1.encoding.hex.decode(bytecodeHex));
|
|
431
|
+
return {
|
|
432
|
+
modules: [bytecode],
|
|
433
|
+
dependencies: ["0x1", "0x2", tokenBridgePackageId, coreBridgePackageId].map((d) => (0, utils_1.normalizeSuiObjectId)(d)),
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
createUnsignedTx(txReq, description, parallelizable = false) {
|
|
437
|
+
return new sdk_sui_1.SuiUnsignedTransaction(txReq, this.network, this.chain, description, parallelizable);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
exports.SuiTokenBridge = SuiTokenBridge;
|
|
441
|
+
//# sourceMappingURL=tokenBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenBridge.js","sourceRoot":"","sources":["../../src/tokenBridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { SuiClient, SuiObjectResponse } from "@mysten/sui.js/client";
|
|
2
|
+
export declare const getTokenFromTokenRegistry: (provider: SuiClient, tokenBridgeStateObjectId: string, tokenType: string) => Promise<SuiObjectResponse>;
|
|
3
|
+
export declare const getTokenCoinType: (provider: SuiClient, tokenBridgeStateObjectId: string, tokenAddress: Uint8Array, tokenChain: number) => Promise<string | null>;
|
|
4
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAWrE,eAAO,MAAM,yBAAyB,aAC1B,SAAS,4BACO,MAAM,aACrB,MAAM,KAChB,QAAQ,iBAAiB,CAkC3B,CAAC;AAEF,eAAO,MAAM,gBAAgB,aACjB,SAAS,4BACO,MAAM,gBAClB,UAAU,cACZ,MAAM,KACjB,QAAQ,MAAM,GAAG,IAAI,CAsCvB,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getTokenCoinType = exports.getTokenFromTokenRegistry = void 0;
|
|
4
|
+
const sdk_sui_1 = require("@wormhole-foundation/sdk-sui");
|
|
5
|
+
const getTokenFromTokenRegistry = async (provider, tokenBridgeStateObjectId, tokenType) => {
|
|
6
|
+
if (!(0, sdk_sui_1.isValidSuiType)(tokenType)) {
|
|
7
|
+
throw new Error(`Invalid Sui type: ${tokenType}`);
|
|
8
|
+
}
|
|
9
|
+
const tokenBridgeStateFields = await (0, sdk_sui_1.getObjectFields)(provider, tokenBridgeStateObjectId);
|
|
10
|
+
if (!tokenBridgeStateFields) {
|
|
11
|
+
throw new Error(`Unable to fetch object fields from token bridge state. Object ID: ${tokenBridgeStateObjectId}`);
|
|
12
|
+
}
|
|
13
|
+
const tokenRegistryObjectId = tokenBridgeStateFields["token_registry"].fields?.id?.id;
|
|
14
|
+
if (!tokenRegistryObjectId) {
|
|
15
|
+
throw new Error("Unable to fetch token registry object ID");
|
|
16
|
+
}
|
|
17
|
+
const tokenRegistryPackageId = (0, sdk_sui_1.getPackageIdFromType)(tokenBridgeStateFields["token_registry"]?.type);
|
|
18
|
+
if (!tokenRegistryPackageId) {
|
|
19
|
+
throw new Error("Unable to fetch token registry package ID");
|
|
20
|
+
}
|
|
21
|
+
return provider.getDynamicFieldObject({
|
|
22
|
+
parentId: tokenRegistryObjectId,
|
|
23
|
+
name: {
|
|
24
|
+
type: `${tokenRegistryPackageId}::token_registry::Key<${tokenType}>`,
|
|
25
|
+
value: {
|
|
26
|
+
dummy_field: false,
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
exports.getTokenFromTokenRegistry = getTokenFromTokenRegistry;
|
|
32
|
+
const getTokenCoinType = async (provider, tokenBridgeStateObjectId, tokenAddress, tokenChain) => {
|
|
33
|
+
const tokenBridgeStateFields = await (0, sdk_sui_1.getObjectFields)(provider, tokenBridgeStateObjectId);
|
|
34
|
+
if (!tokenBridgeStateFields)
|
|
35
|
+
throw new Error("Unable to fetch object fields from token bridge state");
|
|
36
|
+
const coinTypes = tokenBridgeStateFields["token_registry"]?.fields?.coin_types;
|
|
37
|
+
const coinTypesObjectId = coinTypes?.fields?.id?.id;
|
|
38
|
+
if (!coinTypesObjectId) {
|
|
39
|
+
throw new Error("Unable to fetch coin types");
|
|
40
|
+
}
|
|
41
|
+
const keyType = (0, sdk_sui_1.getTableKeyType)(coinTypes?.type);
|
|
42
|
+
if (!keyType) {
|
|
43
|
+
throw new Error("Unable to get key type");
|
|
44
|
+
}
|
|
45
|
+
const response = await provider.getDynamicFieldObject({
|
|
46
|
+
parentId: coinTypesObjectId,
|
|
47
|
+
name: {
|
|
48
|
+
type: keyType,
|
|
49
|
+
value: {
|
|
50
|
+
addr: [...tokenAddress],
|
|
51
|
+
chain: tokenChain,
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
if (response.error) {
|
|
56
|
+
if (response.error.code === "dynamicFieldNotFound") {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
throw new Error(`Unexpected getDynamicFieldObject response ${response.error}`);
|
|
60
|
+
}
|
|
61
|
+
const fields = (0, sdk_sui_1.getFieldsFromObjectResponse)(response);
|
|
62
|
+
if (!fields)
|
|
63
|
+
return null;
|
|
64
|
+
if (!(0, sdk_sui_1.isMoveStructObject)(fields))
|
|
65
|
+
throw new Error("What?");
|
|
66
|
+
return "value" in fields ? (0, sdk_sui_1.trimSuiType)(fields["value"]) : null;
|
|
67
|
+
};
|
|
68
|
+
exports.getTokenCoinType = getTokenCoinType;
|
|
69
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAMA,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { _platform } from "@wormhole-foundation/sdk-sui";
|
|
2
|
+
import { registerProtocol } from "@wormhole-foundation/sdk-connect";
|
|
3
|
+
import { SuiTokenBridge } from "./tokenBridge";
|
|
4
|
+
registerProtocol(_platform, "TokenBridge", SuiTokenBridge);
|
|
5
|
+
export * from "./tokenBridge";
|
|
6
|
+
export * from "./utils";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|