Skip to content

Instantly share code, notes, and snippets.

@KABBOUCHI
Last active September 4, 2023 14:55
Show Gist options
  • Save KABBOUCHI/67c6fa97b998b5d140f08879d6d5ea60 to your computer and use it in GitHub Desktop.
Save KABBOUCHI/67c6fa97b998b5d140f08879d6d5ea60 to your computer and use it in GitHub Desktop.
Instadapp - Avocado Multisig

Setup

import { ethers } from "ethers" // ethers@v5
import multisigForwarderABI from "./multisigForwarder.json"
import avoMultisigSafeABI from "./avoMultisigSafe.json"

const avocadoProvider = new ethers.providers.JsonRpcProvider("https://rpc.avocado.instadapp.io")
const polygonProvider = new ethers.providers.JsonRpcProvider("https://polygon-rpc.com")

// Should be connected to chainId 634 (https://rpc.avocado.instadapp.io), before doing any transaction
const provider = new ethers.providers.Web3Provider(window.ethereum)
const signer = provider.getSigner()

const forwarder = new ethers.Contract(
  "0x46978CD477A496028A18c02F07ab7F35EDBa5A54", // available on 10+ networks
  multisigForwarderABI,
  polygonProvider
)

Get safe address by owner and index

const safeAddress = await forwarder.computeAddress(
  ownerAddress, 
  index, // we treat index 0 as avocado personal on https://avocado.instadapp.io/
) 

Check is safe is deployed on a specific network

const isDeployed = await polygonProvider.getCode(safeAddress).then((code) => code !== '0x')

Get safe name and version on a specific network

let name, version

if (isDeployed) {
    const safeContract = new ethers.Contract(
        safeAddress,
        avoMultisigSafeABI,
        polygonProvider
    );
  
    [name, version] = await Promise.all([
        safeContract.DOMAIN_SEPARATOR_NAME(),
        safeContract.DOMAIN_SEPARATOR_VERSION(),
    ])

} else {
    [name, version] = await Promise.all([
        forwarder.avocadoVersionName(ownerAddress, index),
        forwarder.avocadoVersion(ownerAddress, index),
    ])
}

Get nonce, signers, requireSigners, owner

const safeContract = new ethers.Contract(
        safeAddress,
        avoMultisigSafeABI,
        polygonProvider
);

const nonce =  isDeployed ? await contract.avoNonce() : 0
const signers = isDeployed ?  await contract.signers() : [ownerAddress]
const requiredSigners =  isDeployed ? await contract.requiredSigners() : 1
const owner =  isDeployed ? await contract.owner() : "probably the signer?"

Generate a message for signing and executing

// Message types

interface IMessageParams {
    id: number // id for actions, e.g. 0 = CALL, 1 = MIXED (call and delegatecall), 20 = FLASHLOAN_CALL, 21 = FLASHLOAN_MIXED. Default value of 0 will work for all most common use-cases.
    salt: string // salt to customize non-sequential nonce (if `avoSafeNonce` is set to -1), we recommend at least to send `Date.now()`
    source: string // source address for referral system
    actions: IMessageAction[]
    metadata: string // generic additional metadata
    avoNonce: string | number // sequential avoNonce as current value on the smart wallet contract or set to `-1`to use a non-sequential nonce
}

interface IMessageAction {
    target: string
    data: string
    value: string
    operation: string
}

interface IMessageForwardParams {
    gas: string // minimum amount of gas that the relayer (AvoForwarder) is expected to send along for successful execution
    gasPrice: string // maximum gas price at which the signature is valid and can be executed. Not implemented yet.
    validAfter: string // time in seconds after which the signature is valid and can be executed
    validUntil: string // time in seconds until which the signature is valid and can be executed
    value: string | number
}

interface IMessage {
    params: IMessageParams
    forwardParams: IMessageForwardParams
}

// example message
const message: IMessage = {
    params: {
        actions: [{
            target: "0x0000000000000000000000000000000000000000",
            data: "0x",
            value: "0x",
            operation: "0",
        }],
        id: '0',
        avoNonce: "0", //  const nonce =  isDeployed ? await contract.avoNonce() : 0
        salt: ethers.utils.defaultAbiCoder.encode(['uint256'], [Date.now()]),
        source: '0x000000000000000000000000000000000000Cad0',
        metadata: '0x00',
    },

    forwardParams: {
        gas: '0',
        gasPrice: '0',
        validUntil: '0',
        validAfter: '0',
        value: '0',
    }
}

Estimate usdc gas using avocado rpc

interface IEstimatedFeeData {
  fee: string;
  multiplier: string;
  discount: IEstimatedDiscount;
}

interface IEstimatedDiscount {
  amount: number
  transactionCount: number
  program: string
  name: string
  description: string
}

const data: IEstimatedFeeData = await avocadoProvider.send("txn_multisigEstimateFeeWithoutSignature", [
  message,
])

Sign the message

const types = {
  Cast: [
    { name: "params", type: "CastParams" },
    { name: "forwardParams", type: "CastForwardParams" },
  ],
  CastParams: [
    { name: "actions", type: "Action[]" },
    { name: "id", type: "uint256" },
    { name: "avoNonce", type: "int256" },
    { name: "salt", type: "bytes32" },
    { name: "source", type: "address" },
    { name: "metadata", type: "bytes" },
  ],
  Action: [
    { name: "target", type: "address" },
    { name: "data", type: "bytes" },
    { name: "value", type: "uint256" },
    { name: "operation", type: "uint256" },
  ],
  CastForwardParams: [
    { name: "gas", type: "uint256" },
    { name: "gasPrice", type: "uint256" },
    { name: "validAfter", type: "uint256" },
    { name: "validUntil", type: "uint256" },
    { name: "value", type: "uint256" },
  ],
}

const domain = {
      name: "safe name",
      version, "safe version",
      chainId: "634,
      verifyingContract: "safeAddress",
      salt: ethers.utils.solidityKeccak256(['uint256'], [chainId]),
}

// make sure you are on chain id 634
const avoSigner = provider.getSigner()

const signature = await provider._signTypedData(domain, types, message)

Execute & Broadcast

Personal (index == 0 & requiredSigners == 0)
const txHash = await avocadoProvider.send("txn_broadcast",[
  {
     signatures: [ {  signature: "0xsignature", signer: "0xsigner" } ],
     message: {}, // generated message
     owner: "safe owner",
     safe: "safe address",
     index: "0", 
     targetChainId: "137",
     executionSignature: undefined, // required when index > 0 || signatures.length > 1
  }
])
Multisig (index > 0 || signatures.length > 1)

⚠️ we might change executionSignature logic later, its not final

const executionTypes = {
  Cast: [
    { name: "params", type: "CastParams" },
    { name: "forwardParams", type: "CastForwardParams" },
    { name: "signatures", type: "SignatureParams[]" },
  ],
  CastParams: [
    { name: "actions", type: "Action[]" },
    { name: "id", type: "uint256" },
    { name: "avoNonce", type: "int256" },
    { name: "salt", type: "bytes32" },
    { name: "source", type: "address" },
    { name: "metadata", type: "bytes" },
  ],
  Action: [
    { name: "target", type: "address" },
    { name: "data", type: "bytes" },
    { name: "value", type: "uint256" },
    { name: "operation", type: "uint256" },
  ],
  CastForwardParams: [
    { name: "gas", type: "uint256" },
    { name: "gasPrice", type: "uint256" },
    { name: "validAfter", type: "uint256" },
    { name: "validUntil", type: "uint256" },
    { name: "value", type: "uint256" },
  ],
  SignatureParams: [
    { name: "signature", type: "bytes" },
    { name: "signer", type: "address" },
  ]
}

const domain = {
      name: "safe name",
      version, "safe version",
      chainId: "634,
      verifyingContract: "safeAddress",
      salt: ethers.utils.solidityKeccak256(['uint256'], [chainId]),
}

const executionSignature = await provider._signTypedData(domain, executionTypes, message)

const txHash = await avocadoProvider.send("txn_broadcast",[
  {
     signatures: [ {  signature: "0xsignature1", signer: "0xsigner1" }, {  signature: "0xsignature2", signer: "0xsigner2" } ],
     message: {}, // generated message
     owner: "safe owner",
     safe: "safe address",
     index: "0", 
     targetChainId: "137",
     executionSignature,
  }
])

Get all safes for a signer

const safes = await avocadoProvider.send("api_getSafes",[{  address: "0xeoa",  multisig: true  }])

const safe = await avocadoProvider.send("api_getSafe",["0xsafeAddress"])

Get usdc balance by safe address

import BigNumber from "bignumber.js";

const balance = await avocadoProvider.send("api_getSafe",["0xsafeAddress"]) // or ",["0xsafeAddress", "success"])
const balanceWithPendingDeposits = await avocadoProvider.send("api_getSafe",["0xsafeAddress", "pending"])

console.log("Amount: " + new BigNumber(balance).dividedBy(10 ** 18).toFormat())
[
{
"inputs": [
{
"internalType": "contract IAvoRegistry",
"name": "avoRegistry_",
"type": "address"
},
{
"internalType": "address",
"name": "avoForwarder_",
"type": "address"
},
{
"internalType": "contract IAvoSignersList",
"name": "avoSignersList_",
"type": "address"
},
{
"internalType": "contract IAvoConfigV1",
"name": "avoConfigV1_",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "fee",
"type": "uint256"
}
],
"name": "AvocadoMultisig__InsufficientBalance",
"type": "error"
},
{
"inputs": [],
"name": "AvocadoMultisig__InsufficientGasSent",
"type": "error"
},
{
"inputs": [],
"name": "AvocadoMultisig__InvalidEIP1271Signature",
"type": "error"
},
{
"inputs": [],
"name": "AvocadoMultisig__InvalidParams",
"type": "error"
},
{
"inputs": [],
"name": "AvocadoMultisig__InvalidSignature",
"type": "error"
},
{
"inputs": [],
"name": "AvocadoMultisig__InvalidTiming",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "fee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "maxFee",
"type": "uint256"
}
],
"name": "AvocadoMultisig__MaxFee",
"type": "error"
},
{
"inputs": [],
"name": "AvocadoMultisig__ToHexDigit",
"type": "error"
},
{
"inputs": [],
"name": "AvocadoMultisig__Unauthorized",
"type": "error"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "occupiedAvoNonce",
"type": "uint256"
}
],
"name": "AvoNonceOccupied",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "source",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "caller",
"type": "address"
},
{
"indexed": false,
"internalType": "address[]",
"name": "signers",
"type": "address[]"
},
{
"indexed": false,
"internalType": "bytes",
"name": "metadata",
"type": "bytes"
}
],
"name": "CastExecuted",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "source",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "caller",
"type": "address"
},
{
"indexed": false,
"internalType": "address[]",
"name": "signers",
"type": "address[]"
},
{
"indexed": false,
"internalType": "string",
"name": "reason",
"type": "string"
},
{
"indexed": false,
"internalType": "bytes",
"name": "metadata",
"type": "bytes"
}
],
"name": "CastFailed",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "fee",
"type": "uint256"
}
],
"name": "FeePaid",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "fee",
"type": "uint256"
}
],
"name": "FeePayFailed",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint8",
"name": "version",
"type": "uint8"
}
],
"name": "Initialized",
"type": "event"
},
{
"anonymous": false,
"inputs": [],
"name": "ListSyncFailed",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "occupiedNonSequentialNonce",
"type": "bytes32"
}
],
"name": "NonSequentialNonceOccupied",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "messageHash",
"type": "bytes32"
}
],
"name": "RemoveSignedMessage",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint8",
"name": "requiredSigners",
"type": "uint8"
}
],
"name": "RequiredSignersSet",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "messageHash",
"type": "bytes32"
}
],
"name": "SignedMessage",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "signer",
"type": "address"
}
],
"name": "SignerAdded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "signer",
"type": "address"
}
],
"name": "SignerRemoved",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "newImplementation",
"type": "address"
}
],
"name": "Upgraded",
"type": "event"
},
{
"inputs": [],
"name": "ACTION_TYPE_HASH",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "AUTHORIZED_FEE_COLLECTOR",
"outputs": [
{
"internalType": "address payable",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "AUTHORIZED_MAX_FEE",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "AUTHORIZED_MIN_FEE",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "CAST_AUTHORIZED_PARAMS_TYPE_HASH",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "CAST_AUTHORIZED_TYPE_HASH",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "CAST_FORWARD_PARAMS_TYPE_HASH",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "CAST_PARAMS_TYPE_HASH",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "CAST_TYPE_HASH",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "DEFAULT_CHAIN_ID",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "DOMAIN_SEPARATOR_NAME",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "DOMAIN_SEPARATOR_VERSION",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "MAX_SIGNERS_COUNT",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "TYPE_HASH",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "fromImplementation_",
"type": "address"
},
{
"internalType": "bytes",
"name": "data_",
"type": "bytes"
}
],
"name": "_afterUpgradeHook",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "operation",
"type": "uint256"
}
],
"internalType": "struct AvocadoMultisigStructs.Action[]",
"name": "actions_",
"type": "tuple[]"
},
{
"internalType": "uint256",
"name": "id_",
"type": "uint256"
}
],
"name": "_callTargets",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "addSigners_",
"type": "address[]"
},
{
"internalType": "uint8",
"name": "requiredSigners_",
"type": "uint8"
}
],
"name": "addSigners",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "avoForwarder",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "avoNonce",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "avoRegistry",
"outputs": [
{
"internalType": "contract IAvoRegistry",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "avoSignersList",
"outputs": [
{
"internalType": "contract IAvoSignersList",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"components": [
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "operation",
"type": "uint256"
}
],
"internalType": "struct AvocadoMultisigStructs.Action[]",
"name": "actions",
"type": "tuple[]"
},
{
"internalType": "uint256",
"name": "id",
"type": "uint256"
},
{
"internalType": "int256",
"name": "avoNonce",
"type": "int256"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
},
{
"internalType": "address",
"name": "source",
"type": "address"
},
{
"internalType": "bytes",
"name": "metadata",
"type": "bytes"
}
],
"internalType": "struct AvocadoMultisigStructs.CastParams",
"name": "params_",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint256",
"name": "gas",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "gasPrice",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "validAfter",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "validUntil",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"internalType": "struct AvocadoMultisigStructs.CastForwardParams",
"name": "forwardParams_",
"type": "tuple"
},
{
"components": [
{
"internalType": "bytes",
"name": "signature",
"type": "bytes"
},
{
"internalType": "address",
"name": "signer",
"type": "address"
}
],
"internalType": "struct AvocadoMultisigStructs.SignatureParams[]",
"name": "signaturesParams_",
"type": "tuple[]"
}
],
"name": "cast",
"outputs": [
{
"internalType": "bool",
"name": "success_",
"type": "bool"
},
{
"internalType": "string",
"name": "revertReason_",
"type": "string"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"components": [
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "operation",
"type": "uint256"
}
],
"internalType": "struct AvocadoMultisigStructs.Action[]",
"name": "actions",
"type": "tuple[]"
},
{
"internalType": "uint256",
"name": "id",
"type": "uint256"
},
{
"internalType": "int256",
"name": "avoNonce",
"type": "int256"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
},
{
"internalType": "address",
"name": "source",
"type": "address"
},
{
"internalType": "bytes",
"name": "metadata",
"type": "bytes"
}
],
"internalType": "struct AvocadoMultisigStructs.CastParams",
"name": "params_",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint256",
"name": "maxFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "gasPrice",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "validAfter",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "validUntil",
"type": "uint256"
}
],
"internalType": "struct AvocadoMultisigStructs.CastAuthorizedParams",
"name": "authorizedParams_",
"type": "tuple"
},
{
"components": [
{
"internalType": "bytes",
"name": "signature",
"type": "bytes"
},
{
"internalType": "address",
"name": "signer",
"type": "address"
}
],
"internalType": "struct AvocadoMultisigStructs.SignatureParams[]",
"name": "signaturesParams_",
"type": "tuple[]"
}
],
"name": "castAuthorized",
"outputs": [
{
"internalType": "bool",
"name": "success_",
"type": "bool"
},
{
"internalType": "string",
"name": "revertReason_",
"type": "string"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "domainSeparatorV4",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "",
"type": "uint256[]"
},
{
"internalType": "uint256[]",
"name": "",
"type": "uint256[]"
},
{
"internalType": "address",
"name": "initiator_",
"type": "address"
},
{
"internalType": "bytes",
"name": "data_",
"type": "bytes"
}
],
"name": "executeOperation",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"components": [
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "operation",
"type": "uint256"
}
],
"internalType": "struct AvocadoMultisigStructs.Action[]",
"name": "actions",
"type": "tuple[]"
},
{
"internalType": "uint256",
"name": "id",
"type": "uint256"
},
{
"internalType": "int256",
"name": "avoNonce",
"type": "int256"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
},
{
"internalType": "address",
"name": "source",
"type": "address"
},
{
"internalType": "bytes",
"name": "metadata",
"type": "bytes"
}
],
"internalType": "struct AvocadoMultisigStructs.CastParams",
"name": "params_",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint256",
"name": "gas",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "gasPrice",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "validAfter",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "validUntil",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"internalType": "struct AvocadoMultisigStructs.CastForwardParams",
"name": "forwardParams_",
"type": "tuple"
}
],
"name": "getSigDigest",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"components": [
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "operation",
"type": "uint256"
}
],
"internalType": "struct AvocadoMultisigStructs.Action[]",
"name": "actions",
"type": "tuple[]"
},
{
"internalType": "uint256",
"name": "id",
"type": "uint256"
},
{
"internalType": "int256",
"name": "avoNonce",
"type": "int256"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
},
{
"internalType": "address",
"name": "source",
"type": "address"
},
{
"internalType": "bytes",
"name": "metadata",
"type": "bytes"
}
],
"internalType": "struct AvocadoMultisigStructs.CastParams",
"name": "params_",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint256",
"name": "maxFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "gasPrice",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "validAfter",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "validUntil",
"type": "uint256"
}
],
"internalType": "struct AvocadoMultisigStructs.CastAuthorizedParams",
"name": "authorizedParams_",
"type": "tuple"
}
],
"name": "getSigDigestAuthorized",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "index",
"outputs": [
{
"internalType": "uint32",
"name": "",
"type": "uint32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "initialize",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "signer_",
"type": "address"
}
],
"name": "isSigner",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "hash",
"type": "bytes32"
},
{
"internalType": "bytes",
"name": "signature",
"type": "bytes"
}
],
"name": "isValidSignature",
"outputs": [
{
"internalType": "bytes4",
"name": "magicValue",
"type": "bytes4"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"name": "nonSequentialNonces",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint88[]",
"name": "avoNonces_",
"type": "uint88[]"
}
],
"name": "occupyAvoNonces",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32[]",
"name": "nonSequentialNonces_",
"type": "bytes32[]"
}
],
"name": "occupyNonSequentialNonces",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "uint256[]",
"name": "",
"type": "uint256[]"
},
{
"internalType": "uint256[]",
"name": "",
"type": "uint256[]"
},
{
"internalType": "bytes",
"name": "",
"type": "bytes"
}
],
"name": "onERC1155BatchReceived",
"outputs": [
{
"internalType": "bytes4",
"name": "",
"type": "bytes4"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "uint256",
"name": "",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "",
"type": "bytes"
}
],
"name": "onERC1155Received",
"outputs": [
{
"internalType": "bytes4",
"name": "",
"type": "bytes4"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "uint256",
"name": "",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "",
"type": "bytes"
}
],
"name": "onERC721Received",
"outputs": [
{
"internalType": "bytes4",
"name": "",
"type": "bytes4"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "message_",
"type": "bytes32"
}
],
"name": "removeSignedMessage",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "removeSigners_",
"type": "address[]"
},
{
"internalType": "uint8",
"name": "requiredSigners_",
"type": "uint8"
}
],
"name": "removeSigners",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "requiredSigners",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint8",
"name": "requiredSigners_",
"type": "uint8"
}
],
"name": "setRequiredSigners",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "message_",
"type": "bytes32"
}
],
"name": "signMessage",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "signers",
"outputs": [
{
"internalType": "address[]",
"name": "signers_",
"type": "address[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "signersCount",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes4",
"name": "interfaceId",
"type": "bytes4"
}
],
"name": "supportsInterface",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "avoImplementation_",
"type": "address"
},
{
"internalType": "bytes",
"name": "afterUpgradeHookData_",
"type": "bytes"
}
],
"name": "upgradeTo",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"components": [
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "operation",
"type": "uint256"
}
],
"internalType": "struct AvocadoMultisigStructs.Action[]",
"name": "actions",
"type": "tuple[]"
},
{
"internalType": "uint256",
"name": "id",
"type": "uint256"
},
{
"internalType": "int256",
"name": "avoNonce",
"type": "int256"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
},
{
"internalType": "address",
"name": "source",
"type": "address"
},
{
"internalType": "bytes",
"name": "metadata",
"type": "bytes"
}
],
"internalType": "struct AvocadoMultisigStructs.CastParams",
"name": "params_",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint256",
"name": "gas",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "gasPrice",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "validAfter",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "validUntil",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"internalType": "struct AvocadoMultisigStructs.CastForwardParams",
"name": "forwardParams_",
"type": "tuple"
},
{
"components": [
{
"internalType": "bytes",
"name": "signature",
"type": "bytes"
},
{
"internalType": "address",
"name": "signer",
"type": "address"
}
],
"internalType": "struct AvocadoMultisigStructs.SignatureParams[]",
"name": "signaturesParams_",
"type": "tuple[]"
}
],
"name": "verify",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"components": [
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "operation",
"type": "uint256"
}
],
"internalType": "struct AvocadoMultisigStructs.Action[]",
"name": "actions",
"type": "tuple[]"
},
{
"internalType": "uint256",
"name": "id",
"type": "uint256"
},
{
"internalType": "int256",
"name": "avoNonce",
"type": "int256"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
},
{
"internalType": "address",
"name": "source",
"type": "address"
},
{
"internalType": "bytes",
"name": "metadata",
"type": "bytes"
}
],
"internalType": "struct AvocadoMultisigStructs.CastParams",
"name": "params_",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint256",
"name": "maxFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "gasPrice",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "validAfter",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "validUntil",
"type": "uint256"
}
],
"internalType": "struct AvocadoMultisigStructs.CastAuthorizedParams",
"name": "authorizedParams_",
"type": "tuple"
},
{
"components": [
{
"internalType": "bytes",
"name": "signature",
"type": "bytes"
},
{
"internalType": "address",
"name": "signer",
"type": "address"
}
],
"internalType": "struct AvocadoMultisigStructs.SignatureParams[]",
"name": "signaturesParams_",
"type": "tuple[]"
}
],
"name": "verifyAuthorized",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"stateMutability": "payable",
"type": "receive"
}
]
[
{
"inputs": [
{
"internalType": "contract IAvoFactory",
"name": "avoFactory_",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "AvoForwarder__InvalidParams",
"type": "error"
},
{
"inputs": [],
"name": "AvoForwarder__LegacyVersionNotDeployed",
"type": "error"
},
{
"inputs": [],
"name": "AvoForwarder__Unauthorized",
"type": "error"
},
{
"inputs": [],
"name": "AvoForwarder__Unsupported",
"type": "error"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "auth",
"type": "address"
},
{
"indexed": true,
"internalType": "bool",
"name": "status",
"type": "bool"
}
],
"name": "AuthUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "broadcaster",
"type": "address"
},
{
"indexed": true,
"internalType": "bool",
"name": "status",
"type": "bool"
}
],
"name": "BroadcasterUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "avocadoOwner",
"type": "address"
},
{
"indexed": false,
"internalType": "uint32",
"name": "index",
"type": "uint32"
},
{
"indexed": true,
"internalType": "address",
"name": "avocadoAddress",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "source",
"type": "address"
},
{
"indexed": false,
"internalType": "bytes",
"name": "metadata",
"type": "bytes"
},
{
"indexed": false,
"internalType": "string",
"name": "reason",
"type": "string"
}
],
"name": "ExecuteFailed",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "avocadoOwner",
"type": "address"
},
{
"indexed": false,
"internalType": "uint32",
"name": "index",
"type": "uint32"
},
{
"indexed": true,
"internalType": "address",
"name": "avocadoAddress",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "source",
"type": "address"
},
{
"indexed": false,
"internalType": "bytes",
"name": "metadata",
"type": "bytes"
}
],
"name": "Executed",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint8",
"name": "version",
"type": "uint8"
}
],
"name": "Initialized",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
},
{
"inputs": [],
"name": "avoFactory",
"outputs": [
{
"internalType": "contract IAvoFactory",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner_",
"type": "address"
},
{
"internalType": "uint32",
"name": "index_",
"type": "uint32"
}
],
"name": "avoNonce",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "avocadoBytecode",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner_",
"type": "address"
},
{
"internalType": "uint32",
"name": "index_",
"type": "uint32"
}
],
"name": "avocadoVersion",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner_",
"type": "address"
},
{
"internalType": "uint32",
"name": "index_",
"type": "uint32"
}
],
"name": "avocadoVersionName",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner_",
"type": "address"
},
{
"internalType": "uint32",
"name": "index_",
"type": "uint32"
}
],
"name": "computeAvocado",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "from_",
"type": "address"
},
{
"internalType": "uint32",
"name": "index_",
"type": "uint32"
},
{
"components": [
{
"components": [
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "operation",
"type": "uint256"
}
],
"internalType": "struct AvocadoMultisigStructs.Action[]",
"name": "actions",
"type": "tuple[]"
},
{
"internalType": "uint256",
"name": "id",
"type": "uint256"
},
{
"internalType": "int256",
"name": "avoNonce",
"type": "int256"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
},
{
"internalType": "address",
"name": "source",
"type": "address"
},
{
"internalType": "bytes",
"name": "metadata",
"type": "bytes"
}
],
"internalType": "struct AvocadoMultisigStructs.CastParams",
"name": "params_",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint256",
"name": "gas",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "gasPrice",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "validAfter",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "validUntil",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"internalType": "struct AvocadoMultisigStructs.CastForwardParams",
"name": "forwardParams_",
"type": "tuple"
},
{
"components": [
{
"internalType": "bytes",
"name": "signature",
"type": "bytes"
},
{
"internalType": "address",
"name": "signer",
"type": "address"
}
],
"internalType": "struct AvocadoMultisigStructs.SignatureParams[]",
"name": "signaturesParams_",
"type": "tuple[]"
}
],
"name": "executeV1",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner_",
"type": "address"
},
{
"internalType": "address[]",
"name": "allowedBroadcasters_",
"type": "address[]"
}
],
"name": "initialize",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "auth_",
"type": "address"
}
],
"name": "isAuth",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "broadcaster_",
"type": "address"
}
],
"name": "isBroadcaster",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "from_",
"type": "address"
},
{
"internalType": "uint32",
"name": "index_",
"type": "uint32"
},
{
"components": [
{
"components": [
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "operation",
"type": "uint256"
}
],
"internalType": "struct AvocadoMultisigStructs.Action[]",
"name": "actions",
"type": "tuple[]"
},
{
"internalType": "uint256",
"name": "id",
"type": "uint256"
},
{
"internalType": "int256",
"name": "avoNonce",
"type": "int256"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
},
{
"internalType": "address",
"name": "source",
"type": "address"
},
{
"internalType": "bytes",
"name": "metadata",
"type": "bytes"
}
],
"internalType": "struct AvocadoMultisigStructs.CastParams",
"name": "params_",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint256",
"name": "gas",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "gasPrice",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "validAfter",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "validUntil",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"internalType": "struct AvocadoMultisigStructs.CastForwardParams",
"name": "forwardParams_",
"type": "tuple"
},
{
"components": [
{
"internalType": "bytes",
"name": "signature",
"type": "bytes"
},
{
"internalType": "address",
"name": "signer",
"type": "address"
}
],
"internalType": "struct AvocadoMultisigStructs.SignatureParams[]",
"name": "signaturesParams_",
"type": "tuple[]"
}
],
"name": "simulateV1",
"outputs": [
{
"internalType": "uint256",
"name": "castGasUsed_",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "deploymentGasUsed_",
"type": "uint256"
},
{
"internalType": "bool",
"name": "isDeployed_",
"type": "bool"
},
{
"internalType": "bool",
"name": "success_",
"type": "bool"
},
{
"internalType": "string",
"name": "revertReason_",
"type": "string"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "addr",
"type": "address"
},
{
"internalType": "bool",
"name": "value",
"type": "bool"
}
],
"internalType": "struct AvoForwarderStructs.AddressBool[]",
"name": "authsStatus_",
"type": "tuple[]"
}
],
"name": "updateAuths",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "addr",
"type": "address"
},
{
"internalType": "bool",
"name": "value",
"type": "bool"
}
],
"internalType": "struct AvoForwarderStructs.AddressBool[]",
"name": "broadcastersStatus_",
"type": "tuple[]"
}
],
"name": "updateBroadcasters",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "from_",
"type": "address"
},
{
"internalType": "uint32",
"name": "index_",
"type": "uint32"
},
{
"components": [
{
"components": [
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "operation",
"type": "uint256"
}
],
"internalType": "struct AvocadoMultisigStructs.Action[]",
"name": "actions",
"type": "tuple[]"
},
{
"internalType": "uint256",
"name": "id",
"type": "uint256"
},
{
"internalType": "int256",
"name": "avoNonce",
"type": "int256"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
},
{
"internalType": "address",
"name": "source",
"type": "address"
},
{
"internalType": "bytes",
"name": "metadata",
"type": "bytes"
}
],
"internalType": "struct AvocadoMultisigStructs.CastParams",
"name": "params_",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint256",
"name": "gas",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "gasPrice",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "validAfter",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "validUntil",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"internalType": "struct AvocadoMultisigStructs.CastForwardParams",
"name": "forwardParams_",
"type": "tuple"
},
{
"components": [
{
"internalType": "bytes",
"name": "signature",
"type": "bytes"
},
{
"internalType": "address",
"name": "signer",
"type": "address"
}
],
"internalType": "struct AvocadoMultisigStructs.SignatureParams[]",
"name": "signaturesParams_",
"type": "tuple[]"
}
],
"name": "verifyV1",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
}
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment