Files
web/src/blockchain/contract.js
2024-07-11 00:50:54 -04:00

48 lines
1.4 KiB
JavaScript

import {ethers} from "ethers";
import {AbiURLCache} from "../common.js";
import {provider as walletProvider} from "@/blockchain/wallet.js";
export const abiCache = new AbiURLCache('/contract/out/')
export function vaultAddress( factory, vaultInitCodeHash, owner, num=0) {
if( !owner || !factory || !vaultInitCodeHash )
return null
const salt = ethers.solidityPackedKeccak256(['address','uint8'],[owner,num])
return ethers.getCreate2Address(factory, salt, vaultInitCodeHash)
}
export function contractOrNull(addr,abi,provider) {
try {
return new ethers.Contract(addr,abi,provider)
}
catch (e) {
return null
}
}
export async function queryHelperContract(helper, provider) {
return newContract(helper, 'QueryHelper', provider)
}
// do not supply extensions with name or file: e.g.
// use newContract(addr, 'IVaultLogic', provider, 'IVault') to get the ABI from IVault.sol/IVaultLogic.json
export async function newContract(addr, name, provider) {
const abi = await abiCache.get(name)
return new ethers.Contract(addr, abi, provider)
}
export async function erc20Contract(addr, provider) {
return newContract(addr, 'IERC20Metadata', provider)
}
export async function vaultContract(addr, provider=null) {
if (provider===null)
provider = walletProvider
return await newContract(addr, 'IVault', provider)
}