UNPKG

swapnet-sdk-test-4

Version:
55 lines (54 loc) 2.11 kB
import { keccak256, solidityPacked, toBeHex, zeroPadValue } from "ethers"; import { AddressAsIf, addressAt } from "./addressAsIf.js"; // @ts-ignore import erc20 from '../abi/erc20.json' with { type: "json" }; import { mergeDeep } from "./utils.js"; const getBalanceOfSlotKey = (ownerAddress, mappingSlotNumber)=>{ return keccak256(zeroPadValue(ownerAddress, 32) + toBeHex(mappingSlotNumber, 32).slice(2)).toLowerCase(); }; const getAllowanceSlotKey = (ownerAddress, spenderAddress, mappingSlotNumber)=>{ return keccak256(zeroPadValue(spenderAddress, 32) + keccak256(zeroPadValue(ownerAddress, 32) + toBeHex(mappingSlotNumber, 32).slice(2)).slice(2)); }; export class TokenAsIf extends AddressAsIf { _method = undefined; constructor(address){ super(address); } balanceOf(ownerAddress) { this._method = "balanceOf"; super.stateDiff(getBalanceOfSlotKey(ownerAddress, /* balance map slot number */ 0)); return this; } allowance(ownerAddress, spenderAddress) { this._method = "allowance"; super.stateDiff(getAllowanceSlotKey(ownerAddress, spenderAddress, /* allowance map slot number */ 1)); return this; } is(value) { if (this._method === undefined) { throw new Error(`Method to call of AsIf at ${this.address} is not set!`); } if (this._method === "balanceOf" || this._method === "allowance") { if (typeof value !== 'bigint') { throw new Error(`Invalid value for ${this._method} of AsIf at ${this.address}.`); } const slotValue = solidityPacked([ "uint256" ], [ value ]); super.is(slotValue); } return this; } async valueAsync() { const valueOverride = await super.valueAsync(); const codeOverride = await addressAt(this.address).code().is(erc20.deployedBytecode).valueAsync(); return mergeDeep(valueOverride, codeOverride); } } export const tokenAt = (address)=>{ return new TokenAsIf(address); };