@mantleio/sdk
Version:
[Mantle] Tools for working with Mantle
139 lines • 8.4 kB
JavaScript
"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