swapnet-sdk-test-4
Version:
TypeScript SDK for SwapNet API.
55 lines (54 loc) • 2.11 kB
JavaScript
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);
};