@atomiqlabs/chain-evm
Version:
EVM specific base implementation
77 lines (76 loc) • 4.82 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CitreaSpvVaultContract = void 0;
const EVMSpvVaultContract_1 = require("../../evm/spv_swap/EVMSpvVaultContract");
const EVMSpvVaultData_1 = require("../../evm/spv_swap/EVMSpvVaultData");
const ethers_1 = require("ethers");
const CitreaFees_1 = require("./CitreaFees");
const EVMAddresses_1 = require("../../evm/chain/modules/EVMAddresses");
class CitreaSpvVaultContract extends EVMSpvVaultContract_1.EVMSpvVaultContract {
calculateStateDiff(signer, tokenStateChanges) {
let stateDiffSize = 0;
tokenStateChanges.forEach(val => {
const [address, token] = val.split(":");
if (token.toLowerCase() === this.Chain.getNativeCurrencyAddress().toLowerCase()) {
stateDiffSize += address.toLowerCase() === signer?.toLowerCase() ? CitreaSpvVaultContract.StateDiffSize.NATIVE_SELF_TRANSFER_DIFF_SIZE : CitreaSpvVaultContract.StateDiffSize.NATIVE_TRANSFER_DIFF_SIZE;
}
else {
stateDiffSize += CitreaSpvVaultContract.StateDiffSize.ERC_20_TRANSFER_DIFF_SIZE;
}
});
return stateDiffSize;
}
async getClaimFee(signer, vault, data, feeRate) {
vault ?? (vault = EVMSpvVaultData_1.EVMSpvVaultData.randomVault());
feeRate ?? (feeRate = await this.Chain.Fees.getFeeRate());
const tokenStateChanges = new Set();
let diffSize = CitreaSpvVaultContract.StateDiffSize.BASE_DIFF_SIZE;
const recipient = data != null ? data.recipient : EVMAddresses_1.EVMAddresses.randomAddress();
if (data == null || (data.rawAmounts[0] != null && data.rawAmounts[0] > 0n)) {
const token0Address = vault == null ? EVMAddresses_1.EVMAddresses.randomAddress().toLowerCase() : vault.token0.token.toLowerCase();
tokenStateChanges.add(recipient.toLowerCase() + ":" + token0Address);
if (data == null || data.frontingFeeRate > 0n)
tokenStateChanges.add(ethers_1.ZeroAddress + ":" + token0Address); //Also needs to pay out to fronter
if (data == null || data.callerFeeRate > 0n)
tokenStateChanges.add(signer + ":" + token0Address); //Also needs to pay out to caller
}
if (data == null || (data.rawAmounts[1] != null && data.rawAmounts[1] > 0n)) {
const token1Address = vault == null ? this.Chain.getNativeCurrencyAddress().toLowerCase() : vault.token1.token.toLowerCase();
tokenStateChanges.add(recipient.toLowerCase() + ":" + token1Address);
if (data == null || data.frontingFeeRate > 0n)
tokenStateChanges.add(ethers_1.ZeroAddress + ":" + token1Address); //Also needs to pay out to fronter
if (data == null || data.callerFeeRate > 0n)
tokenStateChanges.add(signer + ":" + token1Address); //Also needs to pay out to caller
}
diffSize += this.calculateStateDiff(signer, tokenStateChanges);
if (data == null || (data.executionHash != null && data.executionHash !== ethers_1.ZeroHash))
diffSize += CitreaSpvVaultContract.StateDiffSize.EXECUTION_SCHEDULE_DIFF_SIZE;
const gasFee = await super.getClaimFee(signer, vault, data, feeRate);
return gasFee + CitreaFees_1.CitreaFees.getGasFee(0, feeRate, diffSize);
}
async getFrontFee(signer, vault, data, feeRate) {
vault ?? (vault = EVMSpvVaultData_1.EVMSpvVaultData.randomVault());
feeRate ?? (feeRate = await this.Chain.Fees.getFeeRate());
const tokenStateChanges = new Set();
let diffSize = CitreaSpvVaultContract.StateDiffSize.BASE_DIFF_SIZE;
if (data == null || (data.rawAmounts[0] != null && data.rawAmounts[0] > 0n)) {
tokenStateChanges.add(signer + ":" + vault.token0.token.toLowerCase());
}
if (data == null || (data.rawAmounts[1] != null && data.rawAmounts[1] > 0n)) {
tokenStateChanges.add(signer + ":" + vault.token1.token.toLowerCase());
}
diffSize += this.calculateStateDiff(signer, tokenStateChanges);
if (data == null || (data.executionHash != null && data.executionHash !== ethers_1.ZeroHash))
diffSize += CitreaSpvVaultContract.StateDiffSize.EXECUTION_SCHEDULE_DIFF_SIZE;
const gasFee = await super.getFrontFee(signer, vault, data, feeRate);
return gasFee + CitreaFees_1.CitreaFees.getGasFee(0, feeRate, diffSize);
}
}
exports.CitreaSpvVaultContract = CitreaSpvVaultContract;
CitreaSpvVaultContract.StateDiffSize = {
BASE_DIFF_SIZE: 50,
ERC_20_TRANSFER_DIFF_SIZE: 50,
NATIVE_SELF_TRANSFER_DIFF_SIZE: 20,
NATIVE_TRANSFER_DIFF_SIZE: 55,
EXECUTION_SCHEDULE_DIFF_SIZE: 40
};