UNPKG

@mantleio/sdk

Version:
139 lines 8.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ERC721BridgeAdapter = void 0; const ethers_1 = require("ethers"); const contracts_bedrock_1 = require("@mantleio/contracts-bedrock"); const core_utils_1 = require("@mantleio/core-utils"); const interfaces_1 = require("../interfaces"); const utils_1 = require("../utils"); class ERC721BridgeAdapter { constructor(opts) { this.populateTransaction = { approve: async (l1Token, l2Token, opts) => { if (!(await this.supportsTokenPair(l1Token, l2Token))) { throw new Error(`token pair not supported by bridge`); } const token = new ethers_1.Contract((0, utils_1.toAddress)(l1Token), (0, contracts_bedrock_1.getContractInterface)('OptimismMintableERC721'), this.messenger.l1Provider); return token.populateTransaction.setApprovalForAll(this.l1Bridge.address, true, (opts === null || opts === void 0 ? void 0 : opts.overrides) || {}); }, deposit: async (l1Token, l2Token, tokenId, opts) => { if (!(await this.supportsTokenPair(l1Token, l2Token))) { throw new Error(`token pair not supported by bridge`); } if ((opts === null || opts === void 0 ? void 0 : opts.recipient) === undefined) { return this.l1Bridge.populateTransaction.bridgeERC721((0, utils_1.toAddress)(l1Token), (0, utils_1.toAddress)(l2Token), tokenId, (opts === null || opts === void 0 ? void 0 : opts.l2GasLimit) || 400000, '0x', (opts === null || opts === void 0 ? void 0 : opts.overrides) || {}); } else { return this.l1Bridge.populateTransaction.bridgeERC721To((0, utils_1.toAddress)(l1Token), (0, utils_1.toAddress)(l2Token), (0, utils_1.toAddress)(opts.recipient), tokenId, (opts === null || opts === void 0 ? void 0 : opts.l2GasLimit) || 400000, '0x', (opts === null || opts === void 0 ? void 0 : opts.overrides) || {}); } }, withdraw: async (l1Token, l2Token, tokenId, opts) => { if (!(await this.supportsTokenPair(l1Token, l2Token))) { throw new Error(`token pair not supported by bridge`); } if ((opts === null || opts === void 0 ? void 0 : opts.recipient) === undefined) { return this.l2Bridge.populateTransaction.bridgeERC721((0, utils_1.toAddress)(l2Token), (0, utils_1.toAddress)(l1Token), tokenId, (opts === null || opts === void 0 ? void 0 : opts.l1GasLimit) || 4000000, '0x', (opts === null || opts === void 0 ? void 0 : opts.overrides) || {}); } else { return this.l2Bridge.populateTransaction.bridgeERC721((0, utils_1.toAddress)(l2Token), (0, utils_1.toAddress)(l1Token), (0, utils_1.toAddress)(opts.recipient), tokenId, (opts === null || opts === void 0 ? void 0 : opts.l1GasLimit) || 4000000, '0x', (opts === null || opts === void 0 ? void 0 : opts.overrides) || {}); } }, }; this.estimateGas = { approve: async (l1Token, l2Token, opts) => { return this.messenger.l1Provider.estimateGas(await this.populateTransaction.approve(l1Token, l2Token, opts)); }, deposit: async (l1Token, l2Token, tokenId, opts) => { return this.messenger.l1Provider.estimateGas(await this.populateTransaction.deposit(l1Token, l2Token, tokenId, opts)); }, withdraw: async (l1Token, l2Token, tokenId, opts) => { return this.messenger.l2Provider.estimateGas(await this.populateTransaction.withdraw(l1Token, l2Token, tokenId, opts)); }, }; this.messenger = opts.messenger; this.l1Bridge = new ethers_1.Contract((0, utils_1.toAddress)(opts.l1Bridge), (0, contracts_bedrock_1.getContractInterface)('L1ERC721Bridge'), this.messenger.l1Provider); this.l2Bridge = new ethers_1.Contract((0, utils_1.toAddress)(opts.l2Bridge), (0, contracts_bedrock_1.getContractInterface)('L2ERC721Bridge'), this.messenger.l2Provider); } async getDepositsByAddress(address, opts) { const events = await this.l1Bridge.queryFilter(this.l1Bridge.filters.ERC721BridgeInitiated(undefined, undefined, address), opts === null || opts === void 0 ? void 0 : opts.fromBlock, opts === null || opts === void 0 ? void 0 : opts.toBlock); return events .map((event) => { return { direction: interfaces_1.MessageDirection.L1_TO_L2, from: event.args.from, to: event.args.to, l1Token: event.args.localToken, l2Token: event.args.remoteToken, tokenId: event.args.tokenId, data: event.args.extraData, logIndex: event.logIndex, blockNumber: event.blockNumber, transactionHash: event.transactionHash, }; }) .sort((a, b) => { return b.blockNumber - a.blockNumber; }); } async getWithdrawalsByAddress(address, opts) { const events = await this.l2Bridge.queryFilter(this.l2Bridge.filters.ERC721BridgeInitiated(undefined, undefined, address), opts === null || opts === void 0 ? void 0 : opts.fromBlock, opts === null || opts === void 0 ? void 0 : opts.toBlock); return events .map((event) => { return { direction: interfaces_1.MessageDirection.L2_TO_L1, from: event.args.from, to: event.args.to, l1Token: event.args.remoteToken, l2Token: event.args.localToken, amount: event.args.amount, data: event.args.extraData, logIndex: event.logIndex, blockNumber: event.blockNumber, transactionHash: event.transactionHash, }; }) .sort((a, b) => { return b.blockNumber - a.blockNumber; }); } async supportsTokenPair(l1Token, l2Token) { var _a, _b; try { const contract = new ethers_1.Contract((0, utils_1.toAddress)(l2Token), (0, contracts_bedrock_1.getContractInterface)('OptimismMintableERC721'), this.messenger.l2Provider); const remoteL1Token = await contract.remoteToken(); if (!(0, core_utils_1.hexStringEquals)(remoteL1Token, (0, utils_1.toAddress)(l1Token))) { return false; } const remoteL2Bridge = await contract.bridge(); if (!(0, core_utils_1.hexStringEquals)(remoteL2Bridge, this.l2Bridge.address)) { return false; } return true; } catch (err) { if (!((_a = err === null || err === void 0 ? void 0 : err.message) === null || _a === void 0 ? void 0 : _a.toString().includes('CALL_EXCEPTION')) && !((_b = err === null || err === void 0 ? void 0 : err.stack) === null || _b === void 0 ? void 0 : _b.toString().includes('execution reverted'))) { console.error('Unexpected error when checking bridge', err); } return false; } } async approval(l1Token, l2Token, signer) { if (!(await this.supportsTokenPair(l1Token, l2Token))) { throw new Error(`token pair not supported by bridge`); } const token = new ethers_1.Contract((0, utils_1.toAddress)(l1Token), (0, contracts_bedrock_1.getContractInterface)('OptimismMintableERC721'), this.messenger.l1Provider); return token.isApprovedForAll(await signer.getAddress(), this.l1Bridge.address); } async approve(l1Token, l2Token, signer, opts) { return signer.sendTransaction(await this.populateTransaction.approve(l1Token, l2Token, opts)); } async deposit(l1Token, l2Token, tokenId, signer, opts) { return signer.sendTransaction(await this.populateTransaction.deposit(l1Token, l2Token, tokenId, opts)); } async withdraw(l1Token, l2Token, tokenId, signer, opts) { return signer.sendTransaction(await this.populateTransaction.withdraw(l1Token, l2Token, tokenId, opts)); } } exports.ERC721BridgeAdapter = ERC721BridgeAdapter; //# sourceMappingURL=erc721-bridge.js.map