"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.spokePoolFixture = exports.zeroAddress = void 0;
exports.getRelayHash = getRelayHash;
exports.getV3RelayHash = getV3RelayHash;
exports.getLegacyV3RelayHash = getLegacyV3RelayHash;
exports.getDepositParams = getDepositParams;
exports.getFillRelayParams = getFillRelayParams;
exports.getFillRelayUpdatedFeeParams = getFillRelayUpdatedFeeParams;
exports.getExecuteSlowRelayParams = getExecuteSlowRelayParams;
exports.modifyRelayHelper = modifyRelayHelper;
exports.getUpdatedV3DepositSignature = getUpdatedV3DepositSignature;
exports.deployMockSpokePoolCaller = deployMockSpokePoolCaller;
exports.deploySpokePool = deploySpokePool;
var tslib_1 = require("tslib");
require("@nomiclabs/hardhat-ethers");
require("@openzeppelin/hardhat-upgrades");
require("hardhat-deploy");
var hardhat_1 = tslib_1.__importDefault(require("hardhat"));
var ethers_1 = require("ethers");
var getContractFactory_1 = require("../utils/getContractFactory");
var constants_1 = require("../constants");
Object.defineProperty(exports, "zeroAddress", { enumerable: true, get: function () { return constants_1.zeroAddress; } });
var _a = ethers_1.ethers.utils, defaultAbiCoder = _a.defaultAbiCoder, keccak256 = _a.keccak256;
function getRelayHash(_depositor, _recipient, _depositId, _originChainId, _destinationChainId, _destinationToken, _amount, _realizedLpFeePct, _relayerFeePct, _message) {
    var relayData = {
        depositor: _depositor,
        recipient: _recipient,
        destinationToken: _destinationToken,
        amount: _amount || constants_1.amountToDeposit,
        originChainId: _originChainId.toString(),
        destinationChainId: _destinationChainId.toString(),
        realizedLpFeePct: _realizedLpFeePct || constants_1.realizedLpFeePct,
        relayerFeePct: _relayerFeePct || constants_1.depositRelayerFeePct,
        depositId: _depositId.toString(),
        message: _message || "0x",
    };
    var relayHash = keccak256(defaultAbiCoder.encode([
        "tuple(address depositor, address recipient, address destinationToken, uint256 amount, uint256 originChainId, uint256 destinationChainId, int64 realizedLpFeePct, int64 relayerFeePct, uint32 depositId, bytes message)",
    ], [relayData]));
    return { relayHash: relayHash, relayData: relayData };
}
function getV3RelayHash(relayData, destChainId) {
    return keccak256(defaultAbiCoder.encode([
        "tuple(bytes32 depositor, bytes32 recipient, bytes32 exclusiveRelayer, bytes32 inputToken, bytes32 outputToken, uint256 inputAmount, uint256 outputAmount, uint256 originChainId, uint256 depositId, uint32 fillDeadline, uint32 exclusivityDeadline, bytes message)",
        "uint256 destinationChainId",
    ], [relayData, destChainId]));
}
function getLegacyV3RelayHash(relayData, destChainId) {
    return keccak256(defaultAbiCoder.encode([
        "tuple(address depositor, address recipient, address exclusiveRelayer, address inputToken, address outputToken, uint256 inputAmount, uint256 outputAmount, uint256 originChainId, uint32 depositId, uint32 fillDeadline, uint32 exclusivityDeadline, bytes message)",
        "uint256 destinationChainId",
    ], [relayData, destChainId]));
}
function getDepositParams(args) {
    var _a, _b, _c, _d;
    return [
        (_a = args.recipient) !== null && _a !== void 0 ? _a : (0, constants_1.randomAddress)(),
        args.originToken,
        args.amount.toString(),
        args.destinationChainId.toString(),
        args.relayerFeePct.toString(),
        args.quoteTimestamp.toString(),
        (_b = args.message) !== null && _b !== void 0 ? _b : "0x",
        (_d = (_c = args === null || args === void 0 ? void 0 : args.maxCount) === null || _c === void 0 ? void 0 : _c.toString()) !== null && _d !== void 0 ? _d : constants_1.maxUint256.toString(),
    ];
}
function getFillRelayParams(_relayData, _maxTokensToSend, _repaymentChain, _maxCount) {
    return [
        _relayData.depositor,
        _relayData.recipient,
        _relayData.destinationToken,
        _relayData.amount.toString(),
        _maxTokensToSend.toString(),
        _repaymentChain ? _repaymentChain.toString() : constants_1.repaymentChainId.toString(),
        _relayData.originChainId,
        _relayData.realizedLpFeePct.toString(),
        _relayData.relayerFeePct.toString(),
        _relayData.depositId,
        _relayData.message || "0x",
        _maxCount ? _maxCount.toString() : constants_1.maxUint256.toString(),
    ];
}
function getFillRelayUpdatedFeeParams(_relayData, _maxTokensToSend, _updatedFee, _signature, _repaymentChain, _updatedRecipient, _updatedMessage, _maxCount) {
    return [
        _relayData.depositor,
        _relayData.recipient,
        _updatedRecipient || _relayData.recipient,
        _relayData.destinationToken,
        _relayData.amount.toString(),
        _maxTokensToSend.toString(),
        _repaymentChain ? _repaymentChain.toString() : constants_1.repaymentChainId.toString(),
        _relayData.originChainId,
        _relayData.realizedLpFeePct.toString(),
        _relayData.relayerFeePct.toString(),
        _updatedFee.toString(),
        _relayData.depositId,
        _relayData.message,
        _updatedMessage || _relayData.message,
        _signature,
        _maxCount ? _maxCount.toString() : constants_1.maxUint256.toString(),
    ];
}
function getExecuteSlowRelayParams(_depositor, _recipient, _destToken, _amount, _originChainId, _realizedLpFeePct, _relayerFeePct, _depositId, _relayerRefundId, _message, _payoutAdjustment, _proof) {
    return [
        _depositor,
        _recipient,
        _destToken,
        _amount.toString(),
        _originChainId.toString(),
        _realizedLpFeePct.toString(),
        _relayerFeePct.toString(),
        _depositId.toString(),
        _relayerRefundId.toString(),
        _message,
        _payoutAdjustment.toString(),
        _proof,
    ];
}
function modifyRelayHelper(modifiedRelayerFeePct, depositId, originChainId, depositor, updatedRecipient, updatedMessage) {
    return tslib_1.__awaiter(this, void 0, void 0, function () {
        var typedData, signature;
        return tslib_1.__generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    typedData = {
                        types: {
                            UpdateDepositDetails: [
                                { name: "depositId", type: "uint32" },
                                { name: "originChainId", type: "uint256" },
                                { name: "updatedRelayerFeePct", type: "int64" },
                                { name: "updatedRecipient", type: "address" },
                                { name: "updatedMessage", type: "bytes" },
                            ],
                        },
                        domain: {
                            name: "ACROSS-V2",
                            version: "1.0.0",
                            chainId: Number(originChainId),
                        },
                        message: {
                            depositId: depositId,
                            originChainId: originChainId,
                            updatedRelayerFeePct: modifiedRelayerFeePct,
                            updatedRecipient: updatedRecipient,
                            updatedMessage: updatedMessage,
                        },
                    };
                    return [4, depositor._signTypedData(typedData.domain, typedData.types, typedData.message)];
                case 1:
                    signature = _a.sent();
                    return [2, { signature: signature }];
            }
        });
    });
}
function getUpdatedV3DepositSignature(depositor, depositId, originChainId, updatedOutputAmount, updatedRecipient, updatedMessage) {
    return tslib_1.__awaiter(this, void 0, void 0, function () {
        var typedData;
        return tslib_1.__generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    typedData = {
                        types: {
                            UpdateDepositDetails: [
                                { name: "depositId", type: "uint256" },
                                { name: "originChainId", type: "uint256" },
                                { name: "updatedOutputAmount", type: "uint256" },
                                { name: "updatedRecipient", type: "bytes32" },
                                { name: "updatedMessage", type: "bytes" },
                            ],
                        },
                        domain: {
                            name: "ACROSS-V2",
                            version: "1.0.0",
                            chainId: originChainId,
                        },
                        message: {
                            depositId: depositId,
                            originChainId: originChainId,
                            updatedOutputAmount: updatedOutputAmount,
                            updatedRecipient: updatedRecipient,
                            updatedMessage: updatedMessage,
                        },
                    };
                    return [4, depositor._signTypedData(typedData.domain, typedData.types, typedData.message)];
                case 1: return [2, _a.sent()];
            }
        });
    });
}
function deployMockSpokePoolCaller(spokePool, rootBundleId, leaf, proof) {
    return tslib_1.__awaiter(this, void 0, void 0, function () {
        var _a, _b;
        return tslib_1.__generator(this, function (_c) {
            switch (_c.label) {
                case 0:
                    _a = getContractFactory_1.getContractFactory;
                    _b = ["MockCaller"];
                    return [4, hardhat_1.default.ethers.getSigners()];
                case 1: return [4, _a.apply(void 0, _b.concat([(_c.sent())[0]]))];
                case 2: return [4, (_c.sent()).deploy(spokePool.address, rootBundleId, leaf, proof)];
                case 3: return [2, _c.sent()];
            }
        });
    });
}
function deploySpokePool(ethers_2) {
    return tslib_1.__awaiter(this, arguments, void 0, function (ethers, spokePoolName) {
        var _a, deployerWallet, crossChainAdmin, hubPool, weth, erc20, unwhitelistedErc20, destErc20, spokePool, _b, _c, erc1271;
        if (spokePoolName === void 0) { spokePoolName = "MockSpokePool"; }
        return tslib_1.__generator(this, function (_d) {
            switch (_d.label) {
                case 0: return [4, ethers.getSigners()];
                case 1:
                    _a = _d.sent(), deployerWallet = _a[0], crossChainAdmin = _a[1], hubPool = _a[2];
                    return [4, (0, getContractFactory_1.getContractFactory)("WETH9", deployerWallet)];
                case 2: return [4, (_d.sent()).deploy()];
                case 3:
                    weth = _d.sent();
                    return [4, (0, getContractFactory_1.getContractFactory)("ExpandedERC20", deployerWallet)];
                case 4: return [4, (_d.sent()).deploy("USD Coin", "USDC", 18)];
                case 5:
                    erc20 = _d.sent();
                    return [4, erc20.addMember(constants_1.TokenRolesEnum.MINTER, deployerWallet.address)];
                case 6:
                    _d.sent();
                    return [4, (0, getContractFactory_1.getContractFactory)("ExpandedERC20", deployerWallet)];
                case 7: return [4, (_d.sent()).deploy("Unwhitelisted", "UNWHITELISTED", 18)];
                case 8:
                    unwhitelistedErc20 = _d.sent();
                    return [4, unwhitelistedErc20.addMember(constants_1.TokenRolesEnum.MINTER, deployerWallet.address)];
                case 9:
                    _d.sent();
                    return [4, (0, getContractFactory_1.getContractFactory)("ExpandedERC20WithBlacklist", deployerWallet)];
                case 10: return [4, (_d.sent()).deploy("L2 USD Coin", "L2 USDC", 18)];
                case 11:
                    destErc20 = _d.sent();
                    return [4, destErc20.addMember(constants_1.TokenRolesEnum.MINTER, deployerWallet.address)];
                case 12:
                    _d.sent();
                    _c = (_b = hardhat_1.default.upgrades).deployProxy;
                    return [4, (0, getContractFactory_1.getContractFactory)(spokePoolName, deployerWallet)];
                case 13: return [4, _c.apply(_b, [_d.sent(), [0, crossChainAdmin.address, hubPool.address],
                        { kind: "uups", unsafeAllow: ["delegatecall"], constructorArgs: [weth.address] }])];
                case 14:
                    spokePool = _d.sent();
                    return [4, spokePool.setChainId(constants_1.destinationChainId)];
                case 15:
                    _d.sent();
                    return [4, (0, getContractFactory_1.getContractFactory)("MockERC1271", deployerWallet)];
                case 16: return [4, (_d.sent()).deploy(deployerWallet.address)];
                case 17:
                    erc1271 = _d.sent();
                    return [2, {
                            weth: weth,
                            erc20: erc20,
                            spokePool: spokePool,
                            unwhitelistedErc20: unwhitelistedErc20,
                            destErc20: destErc20,
                            erc1271: erc1271,
                        }];
            }
        });
    });
}
exports.spokePoolFixture = hardhat_1.default.deployments.createFixture(function (_a) { return tslib_1.__awaiter(void 0, [_a], void 0, function (_b) {
    var ethers = _b.ethers;
    return tslib_1.__generator(this, function (_c) {
        switch (_c.label) {
            case 0: return [4, deploySpokePool(ethers)];
            case 1: return [2, _c.sent()];
        }
    });
}); });
//# sourceMappingURL=SpokePool.Fixture.js.map