@wormhole-foundation/sdk-evm-tbtc 1.14.0-tbtc-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.
- package/dist/cjs/bridge.d.ts +24 -0
- package/dist/cjs/bridge.d.ts.map +1 -0
- package/dist/cjs/bridge.js +79 -0
- package/dist/cjs/bridge.js.map +1 -0
- package/dist/cjs/index.d.ts +2 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +22 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/esm/bridge.d.ts +24 -0
- package/dist/esm/bridge.d.ts.map +1 -0
- package/dist/esm/bridge.js +75 -0
- package/dist/esm/bridge.js.map +1 -0
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +6 -0
- package/dist/esm/index.js.map +1 -0
- package/package.json +83 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AccountAddress, ChainAddress, ChainsConfig, Contracts, Network, Platform } from '@wormhole-foundation/sdk-connect';
|
|
2
|
+
import { TBTCBridge } from '@wormhole-foundation/sdk-connect';
|
|
3
|
+
import type { EvmChains } from '@wormhole-foundation/sdk-evm';
|
|
4
|
+
import { EvmUnsignedTransaction } from '@wormhole-foundation/sdk-evm';
|
|
5
|
+
import { Contract, Provider } from 'ethers';
|
|
6
|
+
import { EvmWormholeCore } from '@wormhole-foundation/sdk-evm-core';
|
|
7
|
+
export declare class EvmTBTCBridge<N extends Network, C extends EvmChains = EvmChains> implements TBTCBridge<N, C> {
|
|
8
|
+
readonly network: N;
|
|
9
|
+
readonly chain: C;
|
|
10
|
+
readonly provider: Provider;
|
|
11
|
+
readonly contracts: Contracts;
|
|
12
|
+
chainId: bigint;
|
|
13
|
+
core: EvmWormholeCore<N, C>;
|
|
14
|
+
gatewayAddress: string;
|
|
15
|
+
gateway: Contract;
|
|
16
|
+
tbtcTokenAddr: string;
|
|
17
|
+
constructor(network: N, chain: C, provider: Provider, contracts: Contracts);
|
|
18
|
+
static fromRpc<N extends Network>(provider: Provider, config: ChainsConfig<N, Platform>): Promise<EvmTBTCBridge<N, EvmChains>>;
|
|
19
|
+
transfer(sender: AccountAddress<C>, recipient: ChainAddress, amount: bigint): AsyncGenerator<EvmUnsignedTransaction<N, C>>;
|
|
20
|
+
redeem(sender: AccountAddress<C>, vaa: TBTCBridge.VAA): AsyncGenerator<EvmUnsignedTransaction<N, C>>;
|
|
21
|
+
private approve;
|
|
22
|
+
private createUnsignedTransaction;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,OAAO,EACP,QAAQ,EACT,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAkB,MAAM,kCAAkC,CAAC;AAC9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAGL,sBAAsB,EAGvB,MAAM,8BAA8B,CAAC;AAMtC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAsB,MAAM,QAAQ,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEpE,qBAAa,aAAa,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,SAAS,SAAS,GAAG,SAAS,CAC3E,YAAW,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;IAYzB,QAAQ,CAAC,OAAO,EAAE,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,QAAQ,CAAC,QAAQ,EAAE,QAAQ;IAC3B,QAAQ,CAAC,SAAS,EAAE,SAAS;IAb/B,OAAO,EAAE,MAAM,CAAC;IAEhB,IAAI,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5B,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,QAAQ,CAAC;IAElB,aAAa,EAAE,MAAM,CAAC;gBAGX,OAAO,EAAE,CAAC,EACV,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,SAAS;WAoClB,OAAO,CAAC,CAAC,SAAS,OAAO,EACpC,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,YAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,GAChC,OAAO,CAAC,aAAa,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAUhC,QAAQ,CACb,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,EACzB,SAAS,EAAE,YAAY,EACvB,MAAM,EAAE,MAAM,GACb,cAAc,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAoBxC,MAAM,CACX,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,EACzB,GAAG,EAAE,UAAU,CAAC,GAAG,GAClB,cAAc,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAiBhC,OAAO;IAsBtB,OAAO,CAAC,yBAAyB;CAYlC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EvmTBTCBridge = void 0;
|
|
4
|
+
const sdk_connect_1 = require("@wormhole-foundation/sdk-connect");
|
|
5
|
+
const sdk_evm_1 = require("@wormhole-foundation/sdk-evm");
|
|
6
|
+
const sdk_base_1 = require("@wormhole-foundation/sdk-base");
|
|
7
|
+
const sdk_definitions_1 = require("@wormhole-foundation/sdk-definitions");
|
|
8
|
+
const ethers_1 = require("ethers");
|
|
9
|
+
const sdk_evm_core_1 = require("@wormhole-foundation/sdk-evm-core");
|
|
10
|
+
class EvmTBTCBridge {
|
|
11
|
+
network;
|
|
12
|
+
chain;
|
|
13
|
+
provider;
|
|
14
|
+
contracts;
|
|
15
|
+
chainId;
|
|
16
|
+
core;
|
|
17
|
+
gatewayAddress;
|
|
18
|
+
gateway;
|
|
19
|
+
tbtcTokenAddr;
|
|
20
|
+
constructor(network, chain, provider, contracts) {
|
|
21
|
+
this.network = network;
|
|
22
|
+
this.chain = chain;
|
|
23
|
+
this.provider = provider;
|
|
24
|
+
this.contracts = contracts;
|
|
25
|
+
if (this.network !== 'Mainnet') {
|
|
26
|
+
throw new Error('TBTC is only supported on Mainnet');
|
|
27
|
+
}
|
|
28
|
+
if (!this.contracts.tbtc) {
|
|
29
|
+
throw new Error('TBTC contract address is required');
|
|
30
|
+
}
|
|
31
|
+
const tbtcToken = sdk_connect_1.TBTCBridge.getNativeTbtcToken(this.chain);
|
|
32
|
+
if (!tbtcToken) {
|
|
33
|
+
throw new Error('Native tbtc token not found');
|
|
34
|
+
}
|
|
35
|
+
this.chainId = sdk_connect_1.nativeChainIds.networkChainToNativeChainId.get(network, chain);
|
|
36
|
+
this.core = new sdk_evm_core_1.EvmWormholeCore(network, chain, provider, contracts);
|
|
37
|
+
this.gatewayAddress = this.contracts.tbtc;
|
|
38
|
+
this.gateway = new ethers_1.Contract(this.gatewayAddress, [
|
|
39
|
+
'function sendTbtc(uint256 amount, uint16 recipientChain, bytes32 recipient, uint256 arbiterFee, uint32 nonce) payable returns (uint64)',
|
|
40
|
+
'function receiveTbtc(bytes calldata encodedVm)',
|
|
41
|
+
], provider);
|
|
42
|
+
this.tbtcTokenAddr = (0, sdk_definitions_1.canonicalAddress)(tbtcToken);
|
|
43
|
+
}
|
|
44
|
+
static async fromRpc(provider, config) {
|
|
45
|
+
const [network, chain] = await sdk_evm_1.EvmPlatform.chainFromRpc(provider);
|
|
46
|
+
const conf = config[chain];
|
|
47
|
+
if (conf.network !== network)
|
|
48
|
+
throw new Error(`Network mismatch: ${conf.network} != ${network}`);
|
|
49
|
+
return new EvmTBTCBridge(network, chain, provider, conf.contracts);
|
|
50
|
+
}
|
|
51
|
+
async *transfer(sender, recipient, amount) {
|
|
52
|
+
const senderAddress = new sdk_evm_1.EvmAddress(sender).toString();
|
|
53
|
+
const tx = await this.gateway.sendTbtc.populateTransaction(amount, (0, sdk_base_1.toChainId)(recipient.chain), recipient.address.toUniversalAddress().toUint8Array(), 0n, 0n);
|
|
54
|
+
tx.value = await this.core.getMessageFee();
|
|
55
|
+
yield* this.approve(senderAddress, amount, this.gatewayAddress);
|
|
56
|
+
yield this.createUnsignedTransaction((0, sdk_evm_1.addFrom)(tx, senderAddress), 'TBTCBridge.Send');
|
|
57
|
+
}
|
|
58
|
+
async *redeem(sender, vaa) {
|
|
59
|
+
if (vaa.payloadName !== 'GatewayTransfer') {
|
|
60
|
+
throw new Error('Invalid VAA payload');
|
|
61
|
+
}
|
|
62
|
+
const address = new sdk_evm_1.EvmAddress(sender).toString();
|
|
63
|
+
const tx = await this.gateway.receiveTbtc.populateTransaction((0, sdk_definitions_1.serialize)(vaa));
|
|
64
|
+
yield this.createUnsignedTransaction((0, sdk_evm_1.addFrom)(tx, address), 'TBTCBridge.Redeem');
|
|
65
|
+
}
|
|
66
|
+
async *approve(senderAddr, amount, contract) {
|
|
67
|
+
const tokenContract = sdk_evm_1.EvmPlatform.getTokenImplementation(this.provider, this.tbtcTokenAddr);
|
|
68
|
+
const allowance = await tokenContract.allowance(senderAddr, contract);
|
|
69
|
+
if (allowance < amount) {
|
|
70
|
+
const txReq = await tokenContract.approve.populateTransaction(contract, amount);
|
|
71
|
+
yield this.createUnsignedTransaction((0, sdk_evm_1.addFrom)(txReq, senderAddr), 'TBTC.Approve');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
createUnsignedTransaction(txReq, description) {
|
|
75
|
+
return new sdk_evm_1.EvmUnsignedTransaction((0, sdk_evm_1.addChainId)(txReq, this.chainId), this.network, this.chain, description, false);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.EvmTBTCBridge = EvmTBTCBridge;
|
|
79
|
+
//# sourceMappingURL=bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../src/bridge.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,aAAa,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_evm_1 = require("@wormhole-foundation/sdk-evm");
|
|
19
|
+
const bridge_js_1 = require("./bridge.js");
|
|
20
|
+
(0, sdk_connect_1.registerProtocol)(sdk_evm_1._platform, 'TBTCBridge', bridge_js_1.EvmTBTCBridge);
|
|
21
|
+
__exportStar(require("./bridge.js"), 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,0DAAyD;AACzD,2CAA4C;AAE5C,IAAA,8BAAgB,EAAC,mBAAS,EAAE,YAAY,EAAE,yBAAa,CAAC,CAAC;AAEzD,8CAA4B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"commonjs"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AccountAddress, ChainAddress, ChainsConfig, Contracts, Network, Platform } from '@wormhole-foundation/sdk-connect';
|
|
2
|
+
import { TBTCBridge } from '@wormhole-foundation/sdk-connect';
|
|
3
|
+
import type { EvmChains } from '@wormhole-foundation/sdk-evm';
|
|
4
|
+
import { EvmUnsignedTransaction } from '@wormhole-foundation/sdk-evm';
|
|
5
|
+
import { Contract, Provider } from 'ethers';
|
|
6
|
+
import { EvmWormholeCore } from '@wormhole-foundation/sdk-evm-core';
|
|
7
|
+
export declare class EvmTBTCBridge<N extends Network, C extends EvmChains = EvmChains> implements TBTCBridge<N, C> {
|
|
8
|
+
readonly network: N;
|
|
9
|
+
readonly chain: C;
|
|
10
|
+
readonly provider: Provider;
|
|
11
|
+
readonly contracts: Contracts;
|
|
12
|
+
chainId: bigint;
|
|
13
|
+
core: EvmWormholeCore<N, C>;
|
|
14
|
+
gatewayAddress: string;
|
|
15
|
+
gateway: Contract;
|
|
16
|
+
tbtcTokenAddr: string;
|
|
17
|
+
constructor(network: N, chain: C, provider: Provider, contracts: Contracts);
|
|
18
|
+
static fromRpc<N extends Network>(provider: Provider, config: ChainsConfig<N, Platform>): Promise<EvmTBTCBridge<N, EvmChains>>;
|
|
19
|
+
transfer(sender: AccountAddress<C>, recipient: ChainAddress, amount: bigint): AsyncGenerator<EvmUnsignedTransaction<N, C>>;
|
|
20
|
+
redeem(sender: AccountAddress<C>, vaa: TBTCBridge.VAA): AsyncGenerator<EvmUnsignedTransaction<N, C>>;
|
|
21
|
+
private approve;
|
|
22
|
+
private createUnsignedTransaction;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,OAAO,EACP,QAAQ,EACT,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAkB,MAAM,kCAAkC,CAAC;AAC9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAGL,sBAAsB,EAGvB,MAAM,8BAA8B,CAAC;AAMtC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAsB,MAAM,QAAQ,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEpE,qBAAa,aAAa,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,SAAS,SAAS,GAAG,SAAS,CAC3E,YAAW,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;IAYzB,QAAQ,CAAC,OAAO,EAAE,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,QAAQ,CAAC,QAAQ,EAAE,QAAQ;IAC3B,QAAQ,CAAC,SAAS,EAAE,SAAS;IAb/B,OAAO,EAAE,MAAM,CAAC;IAEhB,IAAI,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5B,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,QAAQ,CAAC;IAElB,aAAa,EAAE,MAAM,CAAC;gBAGX,OAAO,EAAE,CAAC,EACV,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,SAAS;WAoClB,OAAO,CAAC,CAAC,SAAS,OAAO,EACpC,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,YAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,GAChC,OAAO,CAAC,aAAa,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAUhC,QAAQ,CACb,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,EACzB,SAAS,EAAE,YAAY,EACvB,MAAM,EAAE,MAAM,GACb,cAAc,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAoBxC,MAAM,CACX,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,EACzB,GAAG,EAAE,UAAU,CAAC,GAAG,GAClB,cAAc,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAiBhC,OAAO;IAsBtB,OAAO,CAAC,yBAAyB;CAYlC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { TBTCBridge, nativeChainIds } from '@wormhole-foundation/sdk-connect';
|
|
2
|
+
import { EvmAddress, EvmPlatform, EvmUnsignedTransaction, addChainId, addFrom, } from '@wormhole-foundation/sdk-evm';
|
|
3
|
+
import { toChainId } from '@wormhole-foundation/sdk-base';
|
|
4
|
+
import { canonicalAddress, serialize, } from '@wormhole-foundation/sdk-definitions';
|
|
5
|
+
import { Contract } from 'ethers';
|
|
6
|
+
import { EvmWormholeCore } from '@wormhole-foundation/sdk-evm-core';
|
|
7
|
+
export class EvmTBTCBridge {
|
|
8
|
+
network;
|
|
9
|
+
chain;
|
|
10
|
+
provider;
|
|
11
|
+
contracts;
|
|
12
|
+
chainId;
|
|
13
|
+
core;
|
|
14
|
+
gatewayAddress;
|
|
15
|
+
gateway;
|
|
16
|
+
tbtcTokenAddr;
|
|
17
|
+
constructor(network, chain, provider, contracts) {
|
|
18
|
+
this.network = network;
|
|
19
|
+
this.chain = chain;
|
|
20
|
+
this.provider = provider;
|
|
21
|
+
this.contracts = contracts;
|
|
22
|
+
if (this.network !== 'Mainnet') {
|
|
23
|
+
throw new Error('TBTC is only supported on Mainnet');
|
|
24
|
+
}
|
|
25
|
+
if (!this.contracts.tbtc) {
|
|
26
|
+
throw new Error('TBTC contract address is required');
|
|
27
|
+
}
|
|
28
|
+
const tbtcToken = TBTCBridge.getNativeTbtcToken(this.chain);
|
|
29
|
+
if (!tbtcToken) {
|
|
30
|
+
throw new Error('Native tbtc token not found');
|
|
31
|
+
}
|
|
32
|
+
this.chainId = nativeChainIds.networkChainToNativeChainId.get(network, chain);
|
|
33
|
+
this.core = new EvmWormholeCore(network, chain, provider, contracts);
|
|
34
|
+
this.gatewayAddress = this.contracts.tbtc;
|
|
35
|
+
this.gateway = new Contract(this.gatewayAddress, [
|
|
36
|
+
'function sendTbtc(uint256 amount, uint16 recipientChain, bytes32 recipient, uint256 arbiterFee, uint32 nonce) payable returns (uint64)',
|
|
37
|
+
'function receiveTbtc(bytes calldata encodedVm)',
|
|
38
|
+
], provider);
|
|
39
|
+
this.tbtcTokenAddr = canonicalAddress(tbtcToken);
|
|
40
|
+
}
|
|
41
|
+
static async fromRpc(provider, config) {
|
|
42
|
+
const [network, chain] = await EvmPlatform.chainFromRpc(provider);
|
|
43
|
+
const conf = config[chain];
|
|
44
|
+
if (conf.network !== network)
|
|
45
|
+
throw new Error(`Network mismatch: ${conf.network} != ${network}`);
|
|
46
|
+
return new EvmTBTCBridge(network, chain, provider, conf.contracts);
|
|
47
|
+
}
|
|
48
|
+
async *transfer(sender, recipient, amount) {
|
|
49
|
+
const senderAddress = new EvmAddress(sender).toString();
|
|
50
|
+
const tx = await this.gateway.sendTbtc.populateTransaction(amount, toChainId(recipient.chain), recipient.address.toUniversalAddress().toUint8Array(), 0n, 0n);
|
|
51
|
+
tx.value = await this.core.getMessageFee();
|
|
52
|
+
yield* this.approve(senderAddress, amount, this.gatewayAddress);
|
|
53
|
+
yield this.createUnsignedTransaction(addFrom(tx, senderAddress), 'TBTCBridge.Send');
|
|
54
|
+
}
|
|
55
|
+
async *redeem(sender, vaa) {
|
|
56
|
+
if (vaa.payloadName !== 'GatewayTransfer') {
|
|
57
|
+
throw new Error('Invalid VAA payload');
|
|
58
|
+
}
|
|
59
|
+
const address = new EvmAddress(sender).toString();
|
|
60
|
+
const tx = await this.gateway.receiveTbtc.populateTransaction(serialize(vaa));
|
|
61
|
+
yield this.createUnsignedTransaction(addFrom(tx, address), 'TBTCBridge.Redeem');
|
|
62
|
+
}
|
|
63
|
+
async *approve(senderAddr, amount, contract) {
|
|
64
|
+
const tokenContract = EvmPlatform.getTokenImplementation(this.provider, this.tbtcTokenAddr);
|
|
65
|
+
const allowance = await tokenContract.allowance(senderAddr, contract);
|
|
66
|
+
if (allowance < amount) {
|
|
67
|
+
const txReq = await tokenContract.approve.populateTransaction(contract, amount);
|
|
68
|
+
yield this.createUnsignedTransaction(addFrom(txReq, senderAddr), 'TBTC.Approve');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
createUnsignedTransaction(txReq, description) {
|
|
72
|
+
return new EvmUnsignedTransaction(addChainId(txReq, this.chainId), this.network, this.chain, description, false);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../src/bridge.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,aAAa,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { registerProtocol } from '@wormhole-foundation/sdk-connect';
|
|
2
|
+
import { _platform } from '@wormhole-foundation/sdk-evm';
|
|
3
|
+
import { EvmTBTCBridge } from './bridge.js';
|
|
4
|
+
registerProtocol(_platform, 'TBTCBridge', EvmTBTCBridge);
|
|
5
|
+
export * from './bridge.js';
|
|
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,8BAA8B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,gBAAgB,CAAC,SAAS,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;AAEzD,cAAc,aAAa,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@wormhole-foundation/sdk-evm-tbtc",
|
|
3
|
+
"version": "1.14.0-tbtc-beta.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
|
+
"types": "./dist/cjs/index.d.ts",
|
|
18
|
+
"module": "./dist/esm/index.js",
|
|
19
|
+
"author": "",
|
|
20
|
+
"description": "SDK for EVM chains, used in conjunction with @wormhole-foundation/sdk",
|
|
21
|
+
"files": [
|
|
22
|
+
"dist/esm",
|
|
23
|
+
"dist/cjs"
|
|
24
|
+
],
|
|
25
|
+
"keywords": [
|
|
26
|
+
"wormhole",
|
|
27
|
+
"sdk",
|
|
28
|
+
"typescript",
|
|
29
|
+
"connect",
|
|
30
|
+
"tbtc",
|
|
31
|
+
"evm",
|
|
32
|
+
"ethereum",
|
|
33
|
+
"base",
|
|
34
|
+
"polygon",
|
|
35
|
+
"arbitrum",
|
|
36
|
+
"optimism"
|
|
37
|
+
],
|
|
38
|
+
"engines": {
|
|
39
|
+
"node": ">=16"
|
|
40
|
+
},
|
|
41
|
+
"sideEffects": [
|
|
42
|
+
"./dist/cjs/index.js",
|
|
43
|
+
"./dist/esm/index.js"
|
|
44
|
+
],
|
|
45
|
+
"scripts": {
|
|
46
|
+
"build:cjs": "tsc -p ./tsconfig.cjs.json && echo '{\"type\":\"commonjs\"}' > dist/cjs/package.json",
|
|
47
|
+
"build:esm": "tsc -p ./tsconfig.esm.json",
|
|
48
|
+
"build": "npm run build:esm && npm run build:cjs",
|
|
49
|
+
"rebuild": "npm run clean && npm run build",
|
|
50
|
+
"clean": "rm -rf ./dist && rm -rf ./.turbo",
|
|
51
|
+
"lint": "npm run prettier && eslint --fix ./src --ext .ts",
|
|
52
|
+
"prettier": "prettier --write ./src"
|
|
53
|
+
},
|
|
54
|
+
"dependencies": {
|
|
55
|
+
"@wormhole-foundation/sdk-connect": "1.14.0-tbtc-beta.0",
|
|
56
|
+
"@wormhole-foundation/sdk-evm": "1.14.0-tbtc-beta.0",
|
|
57
|
+
"@wormhole-foundation/sdk-evm-core": "1.14.0-tbtc-beta.0",
|
|
58
|
+
"ethers": "^6.5.1"
|
|
59
|
+
},
|
|
60
|
+
"type": "module",
|
|
61
|
+
"exports": {
|
|
62
|
+
".": {
|
|
63
|
+
"react-native": {
|
|
64
|
+
"import": "./dist/esm/index.js",
|
|
65
|
+
"require": "./dist/cjs/index.js",
|
|
66
|
+
"types": "./dist/cjs/index.d.ts",
|
|
67
|
+
"default": "./dist/cjs/index.js"
|
|
68
|
+
},
|
|
69
|
+
"import": {
|
|
70
|
+
"types": "./dist/esm/index.d.ts",
|
|
71
|
+
"default": "./dist/esm/index.js"
|
|
72
|
+
},
|
|
73
|
+
"require": {
|
|
74
|
+
"types": "./dist/cjs/index.d.ts",
|
|
75
|
+
"default": "./dist/cjs/index.js"
|
|
76
|
+
},
|
|
77
|
+
"default": {
|
|
78
|
+
"types": "./dist/cjs/index.d.ts",
|
|
79
|
+
"default": "./dist/cjs/index.js"
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|