/*
* Copyright (c) 2022 The Paypr Company, LLC
*
* This file is part of Gnossis Chain Contracts.
*
* Gnossis Chain Contracts is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Gnossis Chain Contracts is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Paypr Ethereum Contracts. If not, see .
*/
import { BytesLike } from '@ethersproject/bytes';
import { ZERO_ADDRESS } from '@paypr/ethereum-contracts/dist/src/contracts/accounts';
import ContractAddress from '@paypr/ethereum-contracts/dist/src/contracts/ContractAddress';
import { DiamondInitFunction } from '@paypr/ethereum-contracts/dist/src/contracts/diamonds';
import { LikeInterface } from '@paypr/ethereum-contracts/dist/src/contracts/interfaces';
import { BigNumberish } from 'ethers';
import { ITokenMediator, TokenMediatorInit } from '../../types/contracts';
import { AMBLike, ZERO_CHAIN_ID } from './mediator';
export type TokenMediatorLike = LikeInterface;
export interface TokenMediatorInitData {
bridge: AMBLike;
remoteMediator?: TokenMediatorLike;
remoteChainId?: BytesLike;
requestGasLimit: BigNumberish;
tokens?: TokenMediatorTokenInfo[];
}
export interface TokenMediatorTokenInfo {
localToken: ContractAddress;
remoteToken: ContractAddress;
mintAndBurn: boolean;
}
export const buildTokenMediatorInitInitializeFunction = (
tokenMediatorInit: TokenMediatorInit,
initData: TokenMediatorInitData,
): DiamondInitFunction => ({
initAddress: tokenMediatorInit.address,
callData: encodeTokenMediatorInitInitializeCallData(tokenMediatorInit, initData),
});
export const encodeTokenMediatorInitInitializeCallData = (
mediatorInit: TokenMediatorInit,
initData: TokenMediatorInitData,
) =>
mediatorInit.interface.encodeFunctionData('initialize', [
{
bridge: initData.bridge.address,
remoteMediator: initData.remoteMediator?.address || ZERO_ADDRESS,
remoteChainId: initData.remoteChainId || ZERO_CHAIN_ID,
requestGasLimit: initData.requestGasLimit,
tokens: initData.tokens || [],
},
]);
export const buildTokenMediatorInitSetRequestGasLimitFunction = (
tokenMediatorInit: TokenMediatorInit,
requestGasLimit: BigNumberish,
): DiamondInitFunction => ({
initAddress: tokenMediatorInit.address,
callData: encodeTokenMediatorInitSetRequestGasLimitCallData(tokenMediatorInit, requestGasLimit),
});
export const encodeTokenMediatorInitSetRequestGasLimitCallData = (
mediatorInit: TokenMediatorInit,
requestGasLimit: BigNumberish,
) => mediatorInit.interface.encodeFunctionData('setRequestGasLimit', [requestGasLimit]);
export const buildTokenMediatorInitSetRemoteMediatorFunction = (
tokenMediatorInit: TokenMediatorInit,
remoteMediator: TokenMediatorLike,
remoteChainId: BytesLike,
): DiamondInitFunction => ({
initAddress: tokenMediatorInit.address,
callData: encodeTokenMediatorInitSetRemoteMediatorCallData(tokenMediatorInit, remoteMediator, remoteChainId),
});
export const encodeTokenMediatorInitSetRemoteMediatorCallData = (
mediatorInit: TokenMediatorInit,
remoteMediator: TokenMediatorLike,
remoteChainId: BytesLike,
) => mediatorInit.interface.encodeFunctionData('setRemoteMediator', [remoteMediator.address, remoteChainId]);
export const buildTokenMediatorInitAddMediatedTokenFunction = (
tokenMediatorInit: TokenMediatorInit,
tokenInfo: TokenMediatorTokenInfo,
): DiamondInitFunction => ({
initAddress: tokenMediatorInit.address,
callData: encodeTokenMediatorInitAddMediatedTokenCallData(tokenMediatorInit, tokenInfo),
});
export const encodeTokenMediatorInitAddMediatedTokenCallData = (
mediatorInit: TokenMediatorInit,
tokenInfo: TokenMediatorTokenInfo,
) => mediatorInit.interface.encodeFunctionData('addMediatedToken', [tokenInfo]);