UNPKG

viem

Version:

TypeScript Interface for Ethereum

8,367 lines • 225 kB
// Generated with `pnpm gen:tempo-abis`. Do not modify manually.
// Source: tempoxyz/tempo@d656ef5581505b59f1611b358e611f5a602d399e

export const accountKeychain = [
  {
    name: 'authorizeKey',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'keyId' },
      { type: 'uint8', name: 'signatureType' },
      { type: 'uint64', name: 'expiry' },
      { type: 'bool', name: 'enforceLimits' },
      {
        type: 'tuple[]',
        name: 'limits',
        components: [
          { type: 'address', name: 'token' },
          { type: 'uint256', name: 'amount' },
        ],
      },
    ],
    outputs: [],
  },
  {
    name: 'authorizeKey',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'keyId' },
      { type: 'uint8', name: 'signatureType' },
      {
        type: 'tuple',
        name: 'config',
        components: [
          { type: 'uint64', name: 'expiry' },
          { type: 'bool', name: 'enforceLimits' },
          {
            type: 'tuple[]',
            name: 'limits',
            components: [
              { type: 'address', name: 'token' },
              { type: 'uint256', name: 'amount' },
              { type: 'uint64', name: 'period' },
            ],
          },
          { type: 'bool', name: 'allowAnyCalls' },
          {
            type: 'tuple[]',
            name: 'allowedCalls',
            components: [
              { type: 'address', name: 'target' },
              {
                type: 'tuple[]',
                name: 'selectorRules',
                components: [
                  { type: 'bytes4', name: 'selector' },
                  { type: 'address[]', name: 'recipients' },
                ],
              },
            ],
          },
        ],
      },
    ],
    outputs: [],
  },
  {
    name: 'authorizeKey',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'keyId' },
      { type: 'uint8', name: 'signatureType' },
      {
        type: 'tuple',
        name: 'config',
        components: [
          { type: 'uint64', name: 'expiry' },
          { type: 'bool', name: 'enforceLimits' },
          {
            type: 'tuple[]',
            name: 'limits',
            components: [
              { type: 'address', name: 'token' },
              { type: 'uint256', name: 'amount' },
              { type: 'uint64', name: 'period' },
            ],
          },
          { type: 'bool', name: 'allowAnyCalls' },
          {
            type: 'tuple[]',
            name: 'allowedCalls',
            components: [
              { type: 'address', name: 'target' },
              {
                type: 'tuple[]',
                name: 'selectorRules',
                components: [
                  { type: 'bytes4', name: 'selector' },
                  { type: 'address[]', name: 'recipients' },
                ],
              },
            ],
          },
        ],
      },
      { type: 'bytes32', name: 'witness' },
    ],
    outputs: [],
  },
  {
    name: 'authorizeAdminKey',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'keyId' },
      { type: 'uint8', name: 'signatureType' },
      { type: 'bytes32', name: 'witness' },
    ],
    outputs: [],
  },
  {
    name: 'burnKeyAuthorizationWitness',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'bytes32', name: 'witness' }],
    outputs: [],
  },
  {
    name: 'revokeKey',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'address', name: 'keyId' }],
    outputs: [],
  },
  {
    name: 'updateSpendingLimit',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'keyId' },
      { type: 'address', name: 'token' },
      { type: 'uint256', name: 'newLimit' },
    ],
    outputs: [],
  },
  {
    name: 'setAllowedCalls',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'keyId' },
      {
        type: 'tuple[]',
        name: 'scopes',
        components: [
          { type: 'address', name: 'target' },
          {
            type: 'tuple[]',
            name: 'selectorRules',
            components: [
              { type: 'bytes4', name: 'selector' },
              { type: 'address[]', name: 'recipients' },
            ],
          },
        ],
      },
    ],
    outputs: [],
  },
  {
    name: 'removeAllowedCalls',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'keyId' },
      { type: 'address', name: 'target' },
    ],
    outputs: [],
  },
  {
    name: 'getKey',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'address', name: 'account' },
      { type: 'address', name: 'keyId' },
    ],
    outputs: [
      {
        type: 'tuple',
        components: [
          { type: 'uint8', name: 'signatureType' },
          { type: 'address', name: 'keyId' },
          { type: 'uint64', name: 'expiry' },
          { type: 'bool', name: 'enforceLimits' },
          { type: 'bool', name: 'isRevoked' },
        ],
      },
    ],
  },
  {
    name: 'getRemainingLimit',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'address', name: 'account' },
      { type: 'address', name: 'keyId' },
      { type: 'address', name: 'token' },
    ],
    outputs: [{ type: 'uint256', name: 'remaining' }],
  },
  {
    name: 'getRemainingLimitWithPeriod',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'address', name: 'account' },
      { type: 'address', name: 'keyId' },
      { type: 'address', name: 'token' },
    ],
    outputs: [
      { type: 'uint256', name: 'remaining' },
      { type: 'uint64', name: 'periodEnd' },
    ],
  },
  {
    name: 'getAllowedCalls',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'address', name: 'account' },
      { type: 'address', name: 'keyId' },
    ],
    outputs: [
      { type: 'bool', name: 'isScoped' },
      {
        type: 'tuple[]',
        name: 'scopes',
        components: [
          { type: 'address', name: 'target' },
          {
            type: 'tuple[]',
            name: 'selectorRules',
            components: [
              { type: 'bytes4', name: 'selector' },
              { type: 'address[]', name: 'recipients' },
            ],
          },
        ],
      },
    ],
  },
  {
    name: 'isKeyAuthorizationWitnessBurned',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'address', name: 'account' },
      { type: 'bytes32', name: 'witness' },
    ],
    outputs: [{ type: 'bool' }],
  },
  {
    name: 'isAdminKey',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'address', name: 'account' },
      { type: 'address', name: 'keyId' },
    ],
    outputs: [{ type: 'bool' }],
  },
  {
    name: 'getTransactionKey',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'address' }],
  },
  {
    name: 'KeyAuthorized',
    type: 'event',
    inputs: [
      { type: 'address', name: 'account', indexed: true },
      { type: 'address', name: 'publicKey', indexed: true },
      { type: 'uint8', name: 'signatureType' },
      { type: 'uint64', name: 'expiry' },
    ],
  },
  {
    name: 'AdminKeyAuthorized',
    type: 'event',
    inputs: [
      { type: 'address', name: 'account', indexed: true },
      { type: 'address', name: 'publicKey', indexed: true },
    ],
  },
  {
    name: 'KeyRevoked',
    type: 'event',
    inputs: [
      { type: 'address', name: 'account', indexed: true },
      { type: 'address', name: 'publicKey', indexed: true },
    ],
  },
  {
    name: 'SpendingLimitUpdated',
    type: 'event',
    inputs: [
      { type: 'address', name: 'account', indexed: true },
      { type: 'address', name: 'publicKey', indexed: true },
      { type: 'address', name: 'token', indexed: true },
      { type: 'uint256', name: 'newLimit' },
    ],
  },
  {
    name: 'AccessKeySpend',
    type: 'event',
    inputs: [
      { type: 'address', name: 'account', indexed: true },
      { type: 'address', name: 'publicKey', indexed: true },
      { type: 'address', name: 'token', indexed: true },
      { type: 'uint256', name: 'amount' },
      { type: 'uint256', name: 'remainingLimit' },
    ],
  },
  {
    name: 'KeyAuthorizationWitness',
    type: 'event',
    inputs: [
      { type: 'address', name: 'account', indexed: true },
      { type: 'bytes32', name: 'witness', indexed: true },
    ],
  },
  {
    name: 'KeyAuthorizationWitnessBurned',
    type: 'event',
    inputs: [
      { type: 'address', name: 'account', indexed: true },
      { type: 'bytes32', name: 'witness', indexed: true },
    ],
  },
  { name: 'UnauthorizedCaller', type: 'error', inputs: [] },
  { name: 'KeyAlreadyExists', type: 'error', inputs: [] },
  { name: 'KeyNotFound', type: 'error', inputs: [] },
  { name: 'KeyExpired', type: 'error', inputs: [] },
  { name: 'SpendingLimitExceeded', type: 'error', inputs: [] },
  { name: 'InvalidSpendingLimit', type: 'error', inputs: [] },
  { name: 'InvalidSignatureType', type: 'error', inputs: [] },
  { name: 'ZeroPublicKey', type: 'error', inputs: [] },
  { name: 'ExpiryInPast', type: 'error', inputs: [] },
  { name: 'KeyAlreadyRevoked', type: 'error', inputs: [] },
  {
    name: 'SignatureTypeMismatch',
    type: 'error',
    inputs: [
      { type: 'uint8', name: 'expected' },
      { type: 'uint8', name: 'actual' },
    ],
  },
  { name: 'CallNotAllowed', type: 'error', inputs: [] },
  { name: 'InvalidCallScope', type: 'error', inputs: [] },
  { name: 'InvalidKeyId', type: 'error', inputs: [] },
  { name: 'InvalidKeyAuthorizationWitness', type: 'error', inputs: [] },
  { name: 'KeyAuthorizationWitnessAlreadyBurned', type: 'error', inputs: [] },
  {
    name: 'LegacyAuthorizeKeySelectorChanged',
    type: 'error',
    inputs: [{ type: 'bytes4', name: 'newSelector' }],
  },
] as const

export const addressRegistry = [
  {
    name: 'registerVirtualMaster',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'bytes32', name: 'salt' }],
    outputs: [{ type: 'bytes4', name: 'masterId' }],
  },
  {
    name: 'getMaster',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'bytes4', name: 'masterId' }],
    outputs: [{ type: 'address' }],
  },
  {
    name: 'resolveRecipient',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'address', name: 'to' }],
    outputs: [{ type: 'address', name: 'effectiveRecipient' }],
  },
  {
    name: 'resolveVirtualAddress',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'address', name: 'virtualAddr' }],
    outputs: [{ type: 'address', name: 'master' }],
  },
  {
    name: 'isVirtualAddress',
    type: 'function',
    stateMutability: 'pure',
    inputs: [{ type: 'address', name: 'addr' }],
    outputs: [{ type: 'bool' }],
  },
  {
    name: 'decodeVirtualAddress',
    type: 'function',
    stateMutability: 'pure',
    inputs: [{ type: 'address', name: 'addr' }],
    outputs: [
      { type: 'bool', name: 'isVirtual' },
      { type: 'bytes4', name: 'masterId' },
      { type: 'bytes6', name: 'userTag' },
    ],
  },
  {
    name: 'isImplicitlyApproved',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'address', name: 'addr' }],
    outputs: [{ type: 'bool' }],
  },
  {
    name: 'MasterRegistered',
    type: 'event',
    inputs: [
      { type: 'bytes4', name: 'masterId', indexed: true },
      { type: 'address', name: 'masterAddress', indexed: true },
    ],
  },
  {
    name: 'MasterIdCollision',
    type: 'error',
    inputs: [{ type: 'address', name: 'master' }],
  },
  { name: 'InvalidMasterAddress', type: 'error', inputs: [] },
  { name: 'ProofOfWorkFailed', type: 'error', inputs: [] },
  { name: 'VirtualAddressUnregistered', type: 'error', inputs: [] },
] as const

export const nativeMultisig = [
  {
    name: 'deriveAccount',
    type: 'function',
    stateMutability: 'pure',
    inputs: [
      { type: 'bytes32', name: 'salt' },
      { type: 'uint8', name: 'threshold' },
      {
        type: 'tuple[]',
        name: 'owners',
        components: [
          { type: 'address', name: 'owner' },
          { type: 'uint8', name: 'weight' },
        ],
      },
    ],
    outputs: [{ type: 'address', name: 'account' }],
  },
  {
    name: 'getConfigCommitment',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'address', name: 'account' }],
    outputs: [{ type: 'bytes32', name: 'commitment' }],
  },
  {
    name: 'updateConfig',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      {
        type: 'tuple',
        name: 'current',
        components: [
          { type: 'bytes32', name: 'salt' },
          { type: 'uint64', name: 'version' },
          { type: 'uint8', name: 'threshold' },
          {
            type: 'tuple[]',
            name: 'owners',
            components: [
              { type: 'address', name: 'owner' },
              { type: 'uint8', name: 'weight' },
            ],
          },
        ],
      },
      { type: 'uint8', name: 'threshold' },
      {
        type: 'tuple[]',
        name: 'owners',
        components: [
          { type: 'address', name: 'owner' },
          { type: 'uint8', name: 'weight' },
        ],
      },
    ],
    outputs: [],
  },
  {
    name: 'MultisigConfigUpdated',
    type: 'event',
    inputs: [
      { type: 'address', name: 'account', indexed: true },
      { type: 'bytes32', name: 'salt' },
      { type: 'uint64', name: 'version' },
      { type: 'uint8', name: 'threshold' },
      {
        type: 'tuple[]',
        name: 'owners',
        components: [
          { type: 'address', name: 'owner' },
          { type: 'uint8', name: 'weight' },
        ],
      },
    ],
  },
  { name: 'InvalidAccount', type: 'error', inputs: [] },
  { name: 'InvalidConfig', type: 'error', inputs: [] },
  { name: 'InvalidThreshold', type: 'error', inputs: [] },
  { name: 'InvalidMultisigOwner', type: 'error', inputs: [] },
  { name: 'InvalidWeight', type: 'error', inputs: [] },
  { name: 'TooManyOwners', type: 'error', inputs: [] },
  { name: 'DuplicateOwner', type: 'error', inputs: [] },
  { name: 'InvalidOwnerOrder', type: 'error', inputs: [] },
  { name: 'UnauthorizedMultisigCaller', type: 'error', inputs: [] },
] as const

export const currentCommittee = [
  {
    name: 'getCommitteeMembers',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [
      { type: 'uint64', name: 'epoch' },
      { type: 'bytes32[]', name: 'publicKeys' },
    ],
  },
  {
    name: 'setCommitteeMembers',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'uint64', name: 'epoch' },
      { type: 'bytes32[]', name: 'publicKeys' },
    ],
    outputs: [],
  },
  { name: 'Unauthorized', type: 'error', inputs: [] },
] as const

export const nonce = [
  {
    name: 'getNonce',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'address', name: 'account' },
      { type: 'uint256', name: 'nonceKey' },
    ],
    outputs: [{ type: 'uint64', name: 'nonce' }],
  },
  {
    name: 'NonceIncremented',
    type: 'event',
    inputs: [
      { type: 'address', name: 'account', indexed: true },
      { type: 'uint256', name: 'nonceKey', indexed: true },
      { type: 'uint64', name: 'newNonce' },
    ],
  },
  { name: 'ProtocolNonceNotSupported', type: 'error', inputs: [] },
  { name: 'InvalidNonceKey', type: 'error', inputs: [] },
  { name: 'NonceOverflow', type: 'error', inputs: [] },
  { name: 'ExpiringNonceReplay', type: 'error', inputs: [] },
  { name: 'ExpiringNonceSetFull', type: 'error', inputs: [] },
  { name: 'InvalidExpiringNonceExpiry', type: 'error', inputs: [] },
] as const

export const receivePolicyGuard = [
  {
    name: 'balanceOf',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'bytes', name: 'receipt' }],
    outputs: [{ type: 'uint256', name: 'amount' }],
  },
  {
    name: 'claim',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'to' },
      { type: 'bytes', name: 'receipt' },
    ],
    outputs: [],
  },
  {
    name: 'burnBlockedReceipt',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'bytes', name: 'receipt' }],
    outputs: [],
  },
  {
    name: 'TransferBlocked',
    type: 'event',
    inputs: [
      { type: 'address', name: 'token', indexed: true },
      { type: 'address', name: 'receiver', indexed: true },
      { type: 'uint64', name: 'blockedNonce', indexed: true },
      { type: 'uint256', name: 'amount' },
      { type: 'uint8', name: 'receiptVersion' },
      { type: 'bytes', name: 'receipt' },
    ],
  },
  {
    name: 'ReceiptClaimed',
    type: 'event',
    inputs: [
      { type: 'address', name: 'token', indexed: true },
      { type: 'address', name: 'receiver', indexed: true },
      { type: 'uint64', name: 'blockedNonce', indexed: true },
      { type: 'uint64', name: 'blockedAt' },
      { type: 'uint8', name: 'receiptVersion' },
      { type: 'address', name: 'originator' },
      { type: 'address', name: 'recipient' },
      { type: 'address', name: 'recoveryAuthority' },
      { type: 'address', name: 'caller' },
      { type: 'address', name: 'to' },
      { type: 'uint256', name: 'amount' },
    ],
  },
  {
    name: 'ReceiptBurned',
    type: 'event',
    inputs: [
      { type: 'address', name: 'token', indexed: true },
      { type: 'address', name: 'receiver', indexed: true },
      { type: 'uint64', name: 'blockedNonce', indexed: true },
      { type: 'uint64', name: 'blockedAt' },
      { type: 'uint8', name: 'receiptVersion' },
      { type: 'address', name: 'originator' },
      { type: 'address', name: 'recipient' },
      { type: 'address', name: 'recoveryAuthority' },
      { type: 'address', name: 'caller' },
      { type: 'uint256', name: 'amount' },
    ],
  },
  { name: 'InvalidReceipt', type: 'error', inputs: [] },
  { name: 'InvalidClaimAddress', type: 'error', inputs: [] },
  { name: 'UnauthorizedClaimer', type: 'error', inputs: [] },
  { name: 'AddressReserved', type: 'error', inputs: [] },
] as const

export const signatureVerifier = [
  {
    name: 'recover',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'bytes32', name: 'hash' },
      { type: 'bytes', name: 'signature' },
    ],
    outputs: [{ type: 'address', name: 'signer' }],
  },
  {
    name: 'verify',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'address', name: 'signer' },
      { type: 'bytes32', name: 'hash' },
      { type: 'bytes', name: 'signature' },
    ],
    outputs: [{ type: 'bool' }],
  },
  {
    name: 'verifyKeychain',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'address', name: 'account' },
      { type: 'bytes32', name: 'hash' },
      { type: 'bytes', name: 'signature' },
    ],
    outputs: [{ type: 'bool' }],
  },
  {
    name: 'verifyKeychainAdmin',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'address', name: 'account' },
      { type: 'bytes32', name: 'hash' },
      { type: 'bytes', name: 'signature' },
    ],
    outputs: [{ type: 'bool' }],
  },
  { name: 'InvalidFormat', type: 'error', inputs: [] },
  { name: 'InvalidSignature', type: 'error', inputs: [] },
] as const

export const stablecoinDex = [
  {
    name: 'createPair',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'address', name: 'base' }],
    outputs: [{ type: 'bytes32', name: 'key' }],
  },
  {
    name: 'place',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'token' },
      { type: 'uint128', name: 'amount' },
      { type: 'bool', name: 'isBid' },
      { type: 'int16', name: 'tick' },
    ],
    outputs: [{ type: 'uint128', name: 'orderId' }],
  },
  {
    name: 'placeFlip',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'token' },
      { type: 'uint128', name: 'amount' },
      { type: 'bool', name: 'isBid' },
      { type: 'int16', name: 'tick' },
      { type: 'int16', name: 'flipTick' },
    ],
    outputs: [{ type: 'uint128', name: 'orderId' }],
  },
  {
    name: 'cancel',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'uint128', name: 'orderId' }],
    outputs: [],
  },
  {
    name: 'cancelStaleOrder',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'uint128', name: 'orderId' }],
    outputs: [],
  },
  {
    name: 'swapExactAmountIn',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'tokenIn' },
      { type: 'address', name: 'tokenOut' },
      { type: 'uint128', name: 'amountIn' },
      { type: 'uint128', name: 'minAmountOut' },
    ],
    outputs: [{ type: 'uint128', name: 'amountOut' }],
  },
  {
    name: 'swapExactAmountOut',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'tokenIn' },
      { type: 'address', name: 'tokenOut' },
      { type: 'uint128', name: 'amountOut' },
      { type: 'uint128', name: 'maxAmountIn' },
    ],
    outputs: [{ type: 'uint128', name: 'amountIn' }],
  },
  {
    name: 'quoteSwapExactAmountIn',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'address', name: 'tokenIn' },
      { type: 'address', name: 'tokenOut' },
      { type: 'uint128', name: 'amountIn' },
    ],
    outputs: [{ type: 'uint128', name: 'amountOut' }],
  },
  {
    name: 'quoteSwapExactAmountOut',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'address', name: 'tokenIn' },
      { type: 'address', name: 'tokenOut' },
      { type: 'uint128', name: 'amountOut' },
    ],
    outputs: [{ type: 'uint128', name: 'amountIn' }],
  },
  {
    name: 'balanceOf',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'address', name: 'user' },
      { type: 'address', name: 'token' },
    ],
    outputs: [{ type: 'uint128' }],
  },
  {
    name: 'withdraw',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'token' },
      { type: 'uint128', name: 'amount' },
    ],
    outputs: [],
  },
  {
    name: 'getOrder',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'uint128', name: 'orderId' }],
    outputs: [
      {
        type: 'tuple',
        components: [
          { type: 'uint128', name: 'orderId' },
          { type: 'address', name: 'maker' },
          { type: 'bytes32', name: 'bookKey' },
          { type: 'bool', name: 'isBid' },
          { type: 'int16', name: 'tick' },
          { type: 'uint128', name: 'amount' },
          { type: 'uint128', name: 'remaining' },
          { type: 'uint128', name: 'prev' },
          { type: 'uint128', name: 'next' },
          { type: 'bool', name: 'isFlip' },
          { type: 'int16', name: 'flipTick' },
        ],
      },
    ],
  },
  {
    name: 'getTickLevel',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'address', name: 'base' },
      { type: 'int16', name: 'tick' },
      { type: 'bool', name: 'isBid' },
    ],
    outputs: [
      { type: 'uint128', name: 'head' },
      { type: 'uint128', name: 'tail' },
      { type: 'uint128', name: 'totalLiquidity' },
    ],
  },
  {
    name: 'pairKey',
    type: 'function',
    stateMutability: 'pure',
    inputs: [
      { type: 'address', name: 'tokenA' },
      { type: 'address', name: 'tokenB' },
    ],
    outputs: [{ type: 'bytes32' }],
  },
  {
    name: 'nextOrderId',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint128' }],
  },
  {
    name: 'books',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'bytes32', name: 'pairKey' }],
    outputs: [
      {
        type: 'tuple',
        components: [
          { type: 'address', name: 'base' },
          { type: 'address', name: 'quote' },
          { type: 'int16', name: 'bestBidTick' },
          { type: 'int16', name: 'bestAskTick' },
        ],
      },
    ],
  },
  {
    name: 'bookIndexForKey',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'bytes32', name: 'bookKey' }],
    outputs: [
      { type: 'bool', name: 'set' },
      { type: 'uint32', name: 'index' },
    ],
  },
  {
    name: 'bookKeyForIndex',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'uint32', name: 'index' }],
    outputs: [{ type: 'bytes32', name: 'bookKey' }],
  },
  {
    name: 'setBookIndex',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'uint32', name: 'index' }],
    outputs: [],
  },
  {
    name: 'storageCredits',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'address', name: 'user' }],
    outputs: [{ type: 'uint64', name: 'credits' }],
  },
  {
    name: 'MIN_TICK',
    type: 'function',
    stateMutability: 'pure',
    inputs: [],
    outputs: [{ type: 'int16' }],
  },
  {
    name: 'MAX_TICK',
    type: 'function',
    stateMutability: 'pure',
    inputs: [],
    outputs: [{ type: 'int16' }],
  },
  {
    name: 'TICK_SPACING',
    type: 'function',
    stateMutability: 'pure',
    inputs: [],
    outputs: [{ type: 'int16' }],
  },
  {
    name: 'PRICE_SCALE',
    type: 'function',
    stateMutability: 'pure',
    inputs: [],
    outputs: [{ type: 'uint32' }],
  },
  {
    name: 'MIN_ORDER_AMOUNT',
    type: 'function',
    stateMutability: 'pure',
    inputs: [],
    outputs: [{ type: 'uint128' }],
  },
  {
    name: 'MIN_PRICE',
    type: 'function',
    stateMutability: 'pure',
    inputs: [],
    outputs: [{ type: 'uint32' }],
  },
  {
    name: 'MAX_PRICE',
    type: 'function',
    stateMutability: 'pure',
    inputs: [],
    outputs: [{ type: 'uint32' }],
  },
  {
    name: 'tickToPrice',
    type: 'function',
    stateMutability: 'pure',
    inputs: [{ type: 'int16', name: 'tick' }],
    outputs: [{ type: 'uint32', name: 'price' }],
  },
  {
    name: 'priceToTick',
    type: 'function',
    stateMutability: 'pure',
    inputs: [{ type: 'uint32', name: 'price' }],
    outputs: [{ type: 'int16', name: 'tick' }],
  },
  {
    name: 'PairCreated',
    type: 'event',
    inputs: [
      { type: 'bytes32', name: 'key', indexed: true },
      { type: 'address', name: 'base', indexed: true },
      { type: 'address', name: 'quote', indexed: true },
    ],
  },
  {
    name: 'OrderPlaced',
    type: 'event',
    inputs: [
      { type: 'uint128', name: 'orderId', indexed: true },
      { type: 'address', name: 'maker', indexed: true },
      { type: 'address', name: 'token', indexed: true },
      { type: 'uint128', name: 'amount' },
      { type: 'bool', name: 'isBid' },
      { type: 'int16', name: 'tick' },
      { type: 'bool', name: 'isFlipOrder' },
      { type: 'int16', name: 'flipTick' },
    ],
  },
  {
    name: 'OrderFilled',
    type: 'event',
    inputs: [
      { type: 'uint128', name: 'orderId', indexed: true },
      { type: 'address', name: 'maker', indexed: true },
      { type: 'address', name: 'taker', indexed: true },
      { type: 'uint128', name: 'amountFilled' },
      { type: 'bool', name: 'partialFill' },
    ],
  },
  {
    name: 'OrderFlipped',
    type: 'event',
    inputs: [
      { type: 'uint128', name: 'orderId', indexed: true },
      { type: 'address', name: 'maker', indexed: true },
      { type: 'address', name: 'token', indexed: true },
      { type: 'uint128', name: 'amount' },
      { type: 'bool', name: 'isBid' },
      { type: 'int16', name: 'tick' },
      { type: 'int16', name: 'flipTick' },
    ],
  },
  {
    name: 'FlipFailed',
    type: 'event',
    inputs: [
      { type: 'uint128', name: 'orderId', indexed: true },
      { type: 'address', name: 'maker', indexed: true },
      { type: 'bytes4', name: 'reason' },
    ],
  },
  {
    name: 'OrderCancelled',
    type: 'event',
    inputs: [{ type: 'uint128', name: 'orderId', indexed: true }],
  },
  { name: 'Unauthorized', type: 'error', inputs: [] },
  { name: 'PairDoesNotExist', type: 'error', inputs: [] },
  { name: 'PairAlreadyExists', type: 'error', inputs: [] },
  { name: 'OrderDoesNotExist', type: 'error', inputs: [] },
  { name: 'IdenticalTokens', type: 'error', inputs: [] },
  { name: 'InvalidToken', type: 'error', inputs: [] },
  {
    name: 'TickOutOfBounds',
    type: 'error',
    inputs: [{ type: 'int16', name: 'tick' }],
  },
  { name: 'InvalidTick', type: 'error', inputs: [] },
  { name: 'InvalidFlipTick', type: 'error', inputs: [] },
  { name: 'InsufficientBalance', type: 'error', inputs: [] },
  { name: 'InsufficientLiquidity', type: 'error', inputs: [] },
  { name: 'InsufficientOutput', type: 'error', inputs: [] },
  { name: 'MaxInputExceeded', type: 'error', inputs: [] },
  {
    name: 'BelowMinimumOrderSize',
    type: 'error',
    inputs: [{ type: 'uint128', name: 'amount' }],
  },
  { name: 'InvalidBaseToken', type: 'error', inputs: [] },
  { name: 'OrderNotStale', type: 'error', inputs: [] },
  { name: 'IndexAlreadySet', type: 'error', inputs: [] },
] as const

export const storageCredits = [
  {
    name: 'balanceOf',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'address', name: 'account' }],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'modeOf',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'address', name: 'account' }],
    outputs: [{ type: 'uint8' }],
  },
  {
    name: 'budgetOf',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'address', name: 'account' }],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'setMode',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'uint8', name: 'newMode' }],
    outputs: [],
  },
  {
    name: 'setBudget',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'uint64', name: 'credits' }],
    outputs: [],
  },
  { name: 'InvalidMode', type: 'error', inputs: [] },
  { name: 'OnlyDirectCall', type: 'error', inputs: [] },
] as const

export const feeManager = [
  {
    name: 'userTokens',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'address', name: 'user' }],
    outputs: [{ type: 'address' }],
  },
  {
    name: 'validatorTokens',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'address', name: 'validator' }],
    outputs: [{ type: 'address' }],
  },
  {
    name: 'setUserToken',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'address', name: 'token' }],
    outputs: [],
  },
  {
    name: 'setValidatorToken',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'address', name: 'token' }],
    outputs: [],
  },
  {
    name: 'distributeFees',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'validator' },
      { type: 'address', name: 'token' },
    ],
    outputs: [],
  },
  {
    name: 'collectedFees',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'address', name: 'validator' },
      { type: 'address', name: 'token' },
    ],
    outputs: [{ type: 'uint256' }],
  },
  {
    name: 'UserTokenSet',
    type: 'event',
    inputs: [
      { type: 'address', name: 'user', indexed: true },
      { type: 'address', name: 'token', indexed: true },
    ],
  },
  {
    name: 'ValidatorTokenSet',
    type: 'event',
    inputs: [
      { type: 'address', name: 'validator', indexed: true },
      { type: 'address', name: 'token', indexed: true },
    ],
  },
  {
    name: 'FeesDistributed',
    type: 'event',
    inputs: [
      { type: 'address', name: 'validator', indexed: true },
      { type: 'address', name: 'token', indexed: true },
      { type: 'uint256', name: 'amount' },
    ],
  },
  { name: 'InvalidToken', type: 'error', inputs: [] },
  { name: 'InsufficientFeeTokenBalance', type: 'error', inputs: [] },
  { name: 'CannotChangeWithinBlock', type: 'error', inputs: [] },
] as const

export const feeAmm = [
  {
    name: 'M',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint256' }],
  },
  {
    name: 'N',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint256' }],
  },
  {
    name: 'SCALE',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint256' }],
  },
  {
    name: 'MIN_LIQUIDITY',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint256' }],
  },
  {
    name: 'getPoolId',
    type: 'function',
    stateMutability: 'pure',
    inputs: [
      { type: 'address', name: 'userToken' },
      { type: 'address', name: 'validatorToken' },
    ],
    outputs: [{ type: 'bytes32' }],
  },
  {
    name: 'getPool',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'address', name: 'userToken' },
      { type: 'address', name: 'validatorToken' },
    ],
    outputs: [
      {
        type: 'tuple',
        components: [
          { type: 'uint128', name: 'reserveUserToken' },
          { type: 'uint128', name: 'reserveValidatorToken' },
        ],
      },
    ],
  },
  {
    name: 'pools',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'bytes32', name: 'poolId' }],
    outputs: [
      {
        type: 'tuple',
        components: [
          { type: 'uint128', name: 'reserveUserToken' },
          { type: 'uint128', name: 'reserveValidatorToken' },
        ],
      },
    ],
  },
  {
    name: 'mint',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'userToken' },
      { type: 'address', name: 'validatorToken' },
      { type: 'uint256', name: 'amountValidatorToken' },
      { type: 'address', name: 'to' },
    ],
    outputs: [{ type: 'uint256', name: 'liquidity' }],
  },
  {
    name: 'burn',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'userToken' },
      { type: 'address', name: 'validatorToken' },
      { type: 'uint256', name: 'liquidity' },
      { type: 'address', name: 'to' },
    ],
    outputs: [
      { type: 'uint256', name: 'amountUserToken' },
      { type: 'uint256', name: 'amountValidatorToken' },
    ],
  },
  {
    name: 'totalSupply',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'bytes32', name: 'poolId' }],
    outputs: [{ type: 'uint256' }],
  },
  {
    name: 'liquidityBalances',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'bytes32', name: 'poolId' },
      { type: 'address', name: 'user' },
    ],
    outputs: [{ type: 'uint256' }],
  },
  {
    name: 'rebalanceSwap',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'userToken' },
      { type: 'address', name: 'validatorToken' },
      { type: 'uint256', name: 'amountOut' },
      { type: 'address', name: 'to' },
    ],
    outputs: [{ type: 'uint256', name: 'amountIn' }],
  },
  {
    name: 'Mint',
    type: 'event',
    inputs: [
      { type: 'address', name: 'sender' },
      { type: 'address', name: 'to', indexed: true },
      { type: 'address', name: 'userToken', indexed: true },
      { type: 'address', name: 'validatorToken', indexed: true },
      { type: 'uint256', name: 'amountValidatorToken' },
      { type: 'uint256', name: 'liquidity' },
    ],
  },
  {
    name: 'Burn',
    type: 'event',
    inputs: [
      { type: 'address', name: 'sender', indexed: true },
      { type: 'address', name: 'userToken', indexed: true },
      { type: 'address', name: 'validatorToken', indexed: true },
      { type: 'uint256', name: 'amountUserToken' },
      { type: 'uint256', name: 'amountValidatorToken' },
      { type: 'uint256', name: 'liquidity' },
      { type: 'address', name: 'to' },
    ],
  },
  {
    name: 'RebalanceSwap',
    type: 'event',
    inputs: [
      { type: 'address', name: 'userToken', indexed: true },
      { type: 'address', name: 'validatorToken', indexed: true },
      { type: 'address', name: 'swapper', indexed: true },
      { type: 'uint256', name: 'amountIn' },
      { type: 'uint256', name: 'amountOut' },
    ],
  },
  { name: 'IdenticalAddresses', type: 'error', inputs: [] },
  { name: 'InvalidToken', type: 'error', inputs: [] },
  { name: 'InsufficientLiquidity', type: 'error', inputs: [] },
  { name: 'InsufficientReserves', type: 'error', inputs: [] },
  { name: 'InvalidAmount', type: 'error', inputs: [] },
  { name: 'DivisionByZero', type: 'error', inputs: [] },
  { name: 'InvalidSwapCalculation', type: 'error', inputs: [] },
] as const

export const tip20ChannelReserve = [
  {
    name: 'CLOSE_GRACE_PERIOD',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'VOUCHER_TYPEHASH',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'bytes32' }],
  },
  {
    name: 'open',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'payee' },
      { type: 'address', name: 'operator' },
      { type: 'address', name: 'token' },
      { type: 'uint96', name: 'deposit' },
      { type: 'bytes32', name: 'salt' },
      { type: 'address', name: 'authorizedSigner' },
    ],
    outputs: [{ type: 'bytes32', name: 'channelId' }],
  },
  {
    name: 'settle',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      {
        type: 'tuple',
        name: 'descriptor',
        components: [
          { type: 'address', name: 'payer' },
          { type: 'address', name: 'payee' },
          { type: 'address', name: 'operator' },
          { type: 'address', name: 'token' },
          { type: 'bytes32', name: 'salt' },
          { type: 'address', name: 'authorizedSigner' },
          { type: 'bytes32', name: 'expiringNonceHash' },
        ],
      },
      { type: 'uint96', name: 'cumulativeAmount' },
      { type: 'bytes', name: 'signature' },
    ],
    outputs: [],
  },
  {
    name: 'topUp',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      {
        type: 'tuple',
        name: 'descriptor',
        components: [
          { type: 'address', name: 'payer' },
          { type: 'address', name: 'payee' },
          { type: 'address', name: 'operator' },
          { type: 'address', name: 'token' },
          { type: 'bytes32', name: 'salt' },
          { type: 'address', name: 'authorizedSigner' },
          { type: 'bytes32', name: 'expiringNonceHash' },
        ],
      },
      { type: 'uint96', name: 'additionalDeposit' },
    ],
    outputs: [],
  },
  {
    name: 'close',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      {
        type: 'tuple',
        name: 'descriptor',
        components: [
          { type: 'address', name: 'payer' },
          { type: 'address', name: 'payee' },
          { type: 'address', name: 'operator' },
          { type: 'address', name: 'token' },
          { type: 'bytes32', name: 'salt' },
          { type: 'address', name: 'authorizedSigner' },
          { type: 'bytes32', name: 'expiringNonceHash' },
        ],
      },
      { type: 'uint96', name: 'cumulativeAmount' },
      { type: 'uint96', name: 'captureAmount' },
      { type: 'bytes', name: 'signature' },
    ],
    outputs: [],
  },
  {
    name: 'requestClose',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      {
        type: 'tuple',
        name: 'descriptor',
        components: [
          { type: 'address', name: 'payer' },
          { type: 'address', name: 'payee' },
          { type: 'address', name: 'operator' },
          { type: 'address', name: 'token' },
          { type: 'bytes32', name: 'salt' },
          { type: 'address', name: 'authorizedSigner' },
          { type: 'bytes32', name: 'expiringNonceHash' },
        ],
      },
    ],
    outputs: [],
  },
  {
    name: 'withdraw',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      {
        type: 'tuple',
        name: 'descriptor',
        components: [
          { type: 'address', name: 'payer' },
          { type: 'address', name: 'payee' },
          { type: 'address', name: 'operator' },
          { type: 'address', name: 'token' },
          { type: 'bytes32', name: 'salt' },
          { type: 'address', name: 'authorizedSigner' },
          { type: 'bytes32', name: 'expiringNonceHash' },
        ],
      },
    ],
    outputs: [],
  },
  {
    name: 'getChannel',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      {
        type: 'tuple',
        name: 'descriptor',
        components: [
          { type: 'address', name: 'payer' },
          { type: 'address', name: 'payee' },
          { type: 'address', name: 'operator' },
          { type: 'address', name: 'token' },
          { type: 'bytes32', name: 'salt' },
          { type: 'address', name: 'authorizedSigner' },
          { type: 'bytes32', name: 'expiringNonceHash' },
        ],
      },
    ],
    outputs: [
      {
        type: 'tuple',
        components: [
          {
            type: 'tuple',
            name: 'descriptor',
            components: [
              { type: 'address', name: 'payer' },
              { type: 'address', name: 'payee' },
              { type: 'address', name: 'operator' },
              { type: 'address', name: 'token' },
              { type: 'bytes32', name: 'salt' },
              { type: 'address', name: 'authorizedSigner' },
              { type: 'bytes32', name: 'expiringNonceHash' },
            ],
          },
          {
            type: 'tuple',
            name: 'state',
            components: [
              { type: 'uint96', name: 'settled' },
              { type: 'uint96', name: 'deposit' },
              { type: 'uint32', name: 'closeRequestedAt' },
            ],
          },
        ],
      },
    ],
  },
  {
    name: 'getChannelState',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'bytes32', name: 'channelId' }],
    outputs: [
      {
        type: 'tuple',
        components: [
          { type: 'uint96', name: 'settled' },
          { type: 'uint96', name: 'deposit' },
          { type: 'uint32', name: 'closeRequestedAt' },
        ],
      },
    ],
  },
  {
    name: 'getChannelStatesBatch',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'bytes32[]', name: 'channelIds' }],
    outputs: [
      {
        type: 'tuple[]',
        components: [
          { type: 'uint96', name: 'settled' },
          { type: 'uint96', name: 'deposit' },
          { type: 'uint32', name: 'closeRequestedAt' },
        ],
      },
    ],
  },
  {
    name: 'computeChannelId',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'address', name: 'payer' },
      { type: 'address', name: 'payee' },
      { type: 'address', name: 'operator' },
      { type: 'address', name: 'token' },
      { type: 'bytes32', name: 'salt' },
      { type: 'address', name: 'authorizedSigner' },
      { type: 'bytes32', name: 'expiringNonceHash' },
    ],
    outputs: [{ type: 'bytes32' }],
  },
  {
    name: 'getVoucherDigest',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'bytes32', name: 'channelId' },
      { type: 'uint96', name: 'cumulativeAmount' },
    ],
    outputs: [{ type: 'bytes32' }],
  },
  {
    name: 'domainSeparator',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'bytes32' }],
  },
  {
    name: 'storageCredits',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'address', name: 'payer' }],
    outputs: [{ type: 'uint64', name: 'credits' }],
  },
  {
    name: 'ChannelOpened',
    type: 'event',
    inputs: [
      { type: 'bytes32', name: 'channelId', indexed: true },
      { type: 'address', name: 'payer', indexed: true },
      { type: 'address', name: 'payee', indexed: true },
      { type: 'address', name: 'operator' },
      { type: 'address', name: 'token' },
      { type: 'address', name: 'authorizedSigner' },
      { type: 'bytes32', name: 'salt' },
      { type: 'bytes32', name: 'expiringNonceHash' },
      { type: 'uint96', name: 'deposit' },
    ],
  },
  {
    name: 'Settled',
    type: 'event',
    inputs: [
      { type: 'bytes32', name: 'channelId', indexed: true },
      { type: 'address', name: 'payer', indexed: true },
      { type: 'address', name: 'payee', indexed: true },
      { type: 'uint96', name: 'cumulativeAmount' },
      { type: 'uint96', name: 'deltaPaid' },
      { type: 'uint96', name: 'newSettled' },
    ],
  },
  {
    name: 'TopUp',
    type: 'event',
    inputs: [
      { type: 'bytes32', name: 'channelId', indexed: true },
      { type: 'address', name: 'payer', indexed: true },
      { type: 'address', name: 'payee', indexed: true },
      { type: 'uint96', name: 'additionalDeposit' },
      { type: 'uint96', name: 'newDeposit' },
    ],
  },
  {
    name: 'CloseRequested',
    type: 'event',
    inputs: [
      { type: 'bytes32', name: 'channelId', indexed: true },
      { type: 'address', name: 'payer', indexed: true },
      { type: 'address', name: 'payee', indexed: true },
      { type: 'uint256', name: 'closeGraceEnd' },
    ],
  },
  {
    name: 'ChannelClosed',
    type: 'event',
    inputs: [
      { type: 'bytes32', name: 'channelId', indexed: true },
      { type: 'address', name: 'payer', indexed: true },
      { type: 'address', name: 'payee', indexed: true },
      { type: 'uint96', name: 'settledToPayee' },
      { type: 'uint96', name: 'refundedToPayer' },
    ],
  },
  {
    name: 'CloseRequestCancelled',
    type: 'event',
    inputs: [
      { type: 'bytes32', name: 'channelId', indexed: true },
      { type: 'address', name: 'payer', indexed: true },
      { type: 'address', name: 'payee', indexed: true },
    ],
  },
  { name: 'ChannelAlreadyExists', type: 'error', inputs: [] },
  { name: 'ChannelNotFound', type: 'error', inputs: [] },
  { name: 'NotPayer', type: 'error', inputs: [] },
  { name: 'NotPayeeOrOperator', type: 'error', inputs: [] },
  { name: 'InvalidPayee', type: 'error', inputs: [] },
  { name: 'ZeroDeposit', type: 'error', inputs: [] },
  { name: 'ExpiringNonceHashNotSet', type: 'error', inputs: [] },
  { name: 'InvalidSignature', type: 'error', inputs: [] },
  { name: 'AmountExceedsDeposit', type: 'error', inputs: [] },
  { name: 'AmountNotIncreasing', type: 'error', inputs: [] },
  { name: 'CaptureAmountInvalid', type: 'error', inputs: [] },
  { name: 'CloseNotReady', type: 'error', inputs: [] },
  { name: 'DepositOverflow', type: 'error', inputs: [] },
] as const

export const tip20Factory = [
  {
    name: 'createToken',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'string', name: 'name' },
      { type: 'string', name: 'symbol' },
      { type: 'string', name: 'currency' },
      { type: 'address', name: 'quoteToken' },
      { type: 'address', name: 'admin' },
      { type: 'bytes32', name: 'salt' },
    ],
    outputs: [{ type: 'address' }],
  },
  {
    name: 'createToken',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'string', name: 'name' },
      { type: 'string', name: 'symbol' },
      { type: 'string', name: 'currency' },
      { type: 'address', name: 'quoteToken' },
      { type: 'address', name: 'admin' },
      { type: 'bytes32', name: 'salt' },
      { type: 'string', name: 'logoURI' },
    ],
    outputs: [{ type: 'address' }],
  },
  {
    name: 'isTIP20',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'address', name: 'token' }],
    outputs: [{ type: 'bool' }],
  },
  {
    name: 'getTokenAddress',
    type: 'function',
    stateMutability: 'pure',
    inputs: [
      { type: 'address', name: 'sender' },
      { type: 'bytes32', name: 'salt' },
    ],
    outputs: [{ type: 'address' }],
  },
  {
    name: 'TokenCreated',
    type: 'event',
    inputs: [
      { type: 'address', name: 'token', indexed: true },
      { type: 'string', name: 'name' },
      { type: 'string', name: 'symbol' },
      { type: 'string', name: 'currency' },
      { type: 'address', name: 'quoteToken' },
      { type: 'address', name: 'admin' },
      { type: 'bytes32', name: 'salt' },
    ],
  },
  { name: 'AddressReserved', type: 'error', inputs: [] },
  { name: 'AddressNotReserved', type: 'error', inputs: [] },
  { name: 'InvalidQuoteToken', type: 'error', inputs: [] },
  {
    name: 'TokenAlreadyExists',
    type: 'error',
    inputs: [{ type: 'address', name: 'token' }],
  },
] as const

export const tip20 = [
  {
    name: 'name',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'string' }],
  },
  {
    name: 'symbol',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'string' }],
  },
  {
    name: 'decimals',
    type: 'function',
    stateMutability: 'pure',
    inputs: [],
    outputs: [{ type: 'uint8' }],
  },
  {
    name: 'totalSupply',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint256' }],
  },
  {
    name: 'quoteToken',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'address' }],
  },
  {
    name: 'nextQuoteToken',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'address' }],
  },
  {
    name: 'balanceOf',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'address', name: 'account' }],
    outputs: [{ type: 'uint256' }],
  },
  {
    name: 'transfer',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'to' },
      { type: 'uint256', name: 'amount' },
    ],
    outputs: [{ type: 'bool' }],
  },
  {
    name: 'approve',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'spender' },
      { type: 'uint256', name: 'amount' },
    ],
    outputs: [{ type: 'bool' }],
  },
  {
    name: 'allowance',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'address', name: 'owner' },
      { type: 'address', name: 'spender' },
    ],
    outputs: [{ type: 'uint256' }],
  },
  {
    name: 'transferFrom',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'from' },
      { type: 'address', name: 'to' },
      { type: 'uint256', name: 'amount' },
    ],
    outputs: [{ type: 'bool' }],
  },
  {
    name: 'mint',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'to' },
      { type: 'uint256', name: 'amount' },
    ],
    outputs: [],
  },
  {
    name: 'burn',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'uint256', name: 'amount' }],
    outputs: [],
  },
  {
    name: 'currency',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'string' }],
  },
  {
    name: 'supplyCap',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint256' }],
  },
  {
    name: 'paused',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'bool' }],
  },
  {
    name: 'transferPolicyId',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'logoURI',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'string' }],
  },
  {
    name: 'setLogoURI',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'string', name: 'newLogoURI' }],
    outputs: [],
  },
  {
    name: 'burnBlocked',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'from' },
      { type: 'uint256', name: 'amount' },
    ],
    outputs: [],
  },
  {
    name: 'mintWithMemo',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'to' },
      { type: 'uint256', name: 'amount' },
      { type: 'bytes32', name: 'memo' },
    ],
    outputs: [],
  },
  {
    name: 'burnWithMemo',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'uint256', name: 'amount' },
      { type: 'bytes32', name: 'memo' },
    ],
    outputs: [],
  },
  {
    name: 'transferWithMemo',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'to' },
      { type: 'uint256', name: 'amount' },
      { type: 'bytes32', name: 'memo' },
    ],
    outputs: [],
  },
  {
    name: 'transferFromWithMemo',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'from' },
      { type: 'address', name: 'to' },
      { type: 'uint256', name: 'amount' },
      { type: 'bytes32', name: 'memo' },
    ],
    outputs: [{ type: 'bool' }],
  },
  {
    name: 'changeTransferPolicyId',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'uint64', name: 'newPolicyId' }],
    outputs: [],
  },
  {
    name: 'setSupplyCap',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'uint256', name: 'newSupplyCap' }],
    outputs: [],
  },
  {
    name: 'pause',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [],
    outputs: [],
  },
  {
    name: 'unpause',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [],
    outputs: [],
  },
  {
    name: 'setNextQuoteToken',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'address', name: 'newQuoteToken' }],
    outputs: [],
  },
  {
    name: 'completeQuoteTokenUpdate',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [],
    outputs: [],
  },
  {
    name: 'PAUSE_ROLE',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'bytes32' }],
  },
  {
    name: 'UNPAUSE_ROLE',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'bytes32' }],
  },
  {
    name: 'ISSUER_ROLE',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'bytes32' }],
  },
  {
    name: 'BURN_BLOCKED_ROLE',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'bytes32' }],
  },
  {
    name: 'permit',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'owner' },
      { type: 'address', name: 'spender' },
      { type: 'uint256', name: 'value' },
      { type: 'uint256', name: 'deadline' },
      { type: 'uint8', name: 'v' },
      { type: 'bytes32', name: 'r' },
      { type: 'bytes32', name: 's' },
    ],
    outputs: [],
  },
  {
    name: 'nonces',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'address', name: 'owner' }],
    outputs: [{ type: 'uint256' }],
  },
  {
    name: 'DOMAIN_SEPARATOR',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'bytes32' }],
  },
  {
    name: 'distributeReward',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'uint256', name: 'amount' }],
    outputs: [],
  },
  {
    name: 'setRewardRecipient',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'address', name: 'recipient' }],
    outputs: [],
  },
  {
    name: 'claimRewards',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [],
    outputs: [{ type: 'uint256' }],
  },
  {
    name: 'optedInSupply',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint128' }],
  },
  {
    name: 'globalRewardPerToken',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint256' }],
  },
  {
    name: 'userRewardInfo',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'address', name: 'account' }],
    outputs: [
      {
        type: 'tuple',
        components: [
          { type: 'address', name: 'rewardRecipient' },
          { type: 'uint256', name: 'rewardPerToken' },
          { type: 'uint256', name: 'rewardBalance' },
        ],
      },
    ],
  },
  {
    name: 'getPendingRewards',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'address', name: 'account' }],
    outputs: [{ type: 'uint128' }],
  },
  {
    name: 'Transfer',
    type: 'event',
    inputs: [
      { type: 'address', name: 'from', indexed: true },
      { type: 'address', name: 'to', indexed: true },
      { type: 'uint256', name: 'amount' },
    ],
  },
  {
    name: 'Approval',
    type: 'event',
    inputs: [
      { type: 'address', name: 'owner', indexed: true },
      { type: 'address', name: 'spender', indexed: true },
      { type: 'uint256', name: 'amount' },
    ],
  },
  {
    name: 'Mint',
    type: 'event',
    inputs: [
      { type: 'address', name: 'to', indexed: true },
      { type: 'uint256', name: 'amount' },
    ],
  },
  {
    name: 'Burn',
    type: 'event',
    inputs: [
      { type: 'address', name: 'from', indexed: true },
      { type: 'uint256', name: 'amount' },
    ],
  },
  {
    name: 'BurnBlocked',
    type: 'event',
    inputs: [
      { type: 'address', name: 'from', indexed: true },
      { type: 'uint256', name: 'amount' },
    ],
  },
  {
    name: 'TransferWithMemo',
    type: 'event',
    inputs: [
      { type: 'address', name: 'from', indexed: true },
      { type: 'address', name: 'to', indexed: true },
      { type: 'uint256', name: 'amount' },
      { type: 'bytes32', name: 'memo', indexed: true },
    ],
  },
  {
    name: 'TransferPolicyUpdate',
    type: 'event',
    inputs: [
      { type: 'address', name: 'updater', indexed: true },
      { type: 'uint64', name: 'newPolicyId', indexed: true },
    ],
  },
  {
    name: 'SupplyCapUpdate',
    type: 'event',
    inputs: [
      { type: 'address', name: 'updater', indexed: true },
      { type: 'uint256', name: 'newSupplyCap', indexed: true },
    ],
  },
  {
    name: 'PauseStateUpdate',
    type: 'event',
    inputs: [
      { type: 'address', name: 'updater', indexed: true },
      { type: 'bool', name: 'isPaused' },
    ],
  },
  {
    name: 'NextQuoteTokenSet',
    type: 'event',
    inputs: [
      { type: 'address', name: 'updater', indexed: true },
      { type: 'address', name: 'nextQuoteToken', indexed: true },
    ],
  },
  {
    name: 'QuoteTokenUpdate',
    type: 'event',
    inputs: [
      { type: 'address', name: 'updater', indexed: true },
      { type: 'address', name: 'newQuoteToken', indexed: true },
    ],
  },
  {
    name: 'RewardDistributed',
    type: 'event',
    inputs: [
      { type: 'address', name: 'funder', indexed: true },
      { type: 'uint256', name: 'amount' },
    ],
  },
  {
    name: 'RewardRecipientSet',
    type: 'event',
    inputs: [
      { type: 'address', name: 'holder', indexed: true },
      { type: 'address', name: 'recipient', indexed: true },
    ],
  },
  {
    name: 'LogoURIUpdated',
    type: 'event',
    inputs: [
      { type: 'address', name: 'updater', indexed: true },
      { type: 'string', name: 'newLogoURI' },
    ],
  },
  {
    name: 'InsufficientBalance',
    type: 'error',
    inputs: [
      { type: 'uint256', name: 'available' },
      { type: 'uint256', name: 'required' },
      { type: 'address', name: 'token' },
    ],
  },
  { name: 'InsufficientAllowance', type: 'error', inputs: [] },
  { name: 'SupplyCapExceeded', type: 'error', inputs: [] },
  { name: 'InvalidSupplyCap', type: 'error', inputs: [] },
  { name: 'InvalidPayload', type: 'error', inputs: [] },
  { name: 'PolicyForbids', type: 'error', inputs: [] },
  { name: 'InvalidRecipient', type: 'error', inputs: [] },
  { name: 'ContractPaused', type: 'error', inputs: [] },
  { name: 'InvalidCurrency', type: 'error', inputs: [] },
  { name: 'InvalidQuoteToken', type: 'error', inputs: [] },
  { name: 'InvalidAmount', type: 'error', inputs: [] },
  { name: 'NoOptedInSupply', type: 'error', inputs: [] },
  { name: 'Unauthorized', type: 'error', inputs: [] },
  { name: 'ProtectedAddress', type: 'error', inputs: [] },
  { name: 'InvalidToken', type: 'error', inputs: [] },
  { name: 'Uninitialized', type: 'error', inputs: [] },
  { name: 'InvalidTransferPolicyId', type: 'error', inputs: [] },
  { name: 'PermitExpired', type: 'error', inputs: [] },
  { name: 'InvalidSignature', type: 'error', inputs: [] },
  { name: 'LogoURITooLong', type: 'error', inputs: [] },
  { name: 'InvalidLogoURI', type: 'error', inputs: [] },
  {
    name: 'hasRole',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'address', name: 'account' },
      { type: 'bytes32', name: 'role' },
    ],
    outputs: [{ type: 'bool' }],
  },
  {
    name: 'getRoleAdmin',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'bytes32', name: 'role' }],
    outputs: [{ type: 'bytes32' }],
  },
  {
    name: 'grantRole',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'bytes32', name: 'role' },
      { type: 'address', name: 'account' },
    ],
    outputs: [],
  },
  {
    name: 'revokeRole',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'bytes32', name: 'role' },
      { type: 'address', name: 'account' },
    ],
    outputs: [],
  },
  {
    name: 'renounceRole',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'bytes32', name: 'role' }],
    outputs: [],
  },
  {
    name: 'setRoleAdmin',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'bytes32', name: 'role' },
      { type: 'bytes32', name: 'adminRole' },
    ],
    outputs: [],
  },
  {
    name: 'RoleMembershipUpdated',
    type: 'event',
    inputs: [
      { type: 'bytes32', name: 'role', indexed: true },
      { type: 'address', name: 'account', indexed: true },
      { type: 'address', name: 'sender', indexed: true },
      { type: 'bool', name: 'hasRole' },
    ],
  },
  {
    name: 'RoleAdminUpdated',
    type: 'event',
    inputs: [
      { type: 'bytes32', name: 'role', indexed: true },
      { type: 'bytes32', name: 'newAdminRole', indexed: true },
      { type: 'address', name: 'sender', indexed: true },
    ],
  },
  { name: 'Unauthorized', type: 'error', inputs: [] },
] as const

export const tip403Registry = [
  {
    name: 'policyIdCounter',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'policyExists',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'uint64', name: 'policyId' }],
    outputs: [{ type: 'bool' }],
  },
  {
    name: 'tokenTransferPolicyId',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'address', name: 'token' }],
    outputs: [
      { type: 'bool', name: 'isSet' },
      { type: 'uint64', name: 'policyId' },
    ],
  },
  {
    name: 'policyData',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'uint64', name: 'policyId' }],
    outputs: [
      { type: 'uint8', name: 'policyType' },
      { type: 'address', name: 'admin' },
    ],
  },
  {
    name: 'isAuthorized',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'uint64', name: 'policyId' },
      { type: 'address', name: 'user' },
    ],
    outputs: [{ type: 'bool' }],
  },
  {
    name: 'isAuthorizedSender',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'uint64', name: 'policyId' },
      { type: 'address', name: 'user' },
    ],
    outputs: [{ type: 'bool' }],
  },
  {
    name: 'isAuthorizedRecipient',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'uint64', name: 'policyId' },
      { type: 'address', name: 'user' },
    ],
    outputs: [{ type: 'bool' }],
  },
  {
    name: 'isAuthorizedMintRecipient',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'uint64', name: 'policyId' },
      { type: 'address', name: 'user' },
    ],
    outputs: [{ type: 'bool' }],
  },
  {
    name: 'compoundPolicyData',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'uint64', name: 'policyId' }],
    outputs: [
      { type: 'uint64', name: 'senderPolicyId' },
      { type: 'uint64', name: 'recipientPolicyId' },
      { type: 'uint64', name: 'mintRecipientPolicyId' },
    ],
  },
  {
    name: 'receivePolicy',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'address', name: 'account' }],
    outputs: [
      { type: 'bool', name: 'hasReceivePolicy' },
      { type: 'uint64', name: 'senderPolicyId' },
      { type: 'uint8', name: 'senderPolicyType' },
      { type: 'uint64', name: 'tokenFilterId' },
      { type: 'uint8', name: 'tokenFilterType' },
      { type: 'address', name: 'recoveryAuthority' },
    ],
  },
  {
    name: 'validateReceivePolicy',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'address', name: 'token' },
      { type: 'address', name: 'sender' },
      { type: 'address', name: 'receiver' },
    ],
    outputs: [
      { type: 'bool', name: 'authorized' },
      { type: 'uint8', name: 'blockedReason' },
    ],
  },
  {
    name: 'createPolicy',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'admin' },
      { type: 'uint8', name: 'policyType' },
    ],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'createPolicyWithAccounts',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'admin' },
      { type: 'uint8', name: 'policyType' },
      { type: 'address[]', name: 'accounts' },
    ],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'setPolicyAdmin',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'uint64', name: 'policyId' },
      { type: 'address', name: 'admin' },
    ],
    outputs: [],
  },
  {
    name: 'modifyPolicyWhitelist',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'uint64', name: 'policyId' },
      { type: 'address', name: 'account' },
      { type: 'bool', name: 'allowed' },
    ],
    outputs: [],
  },
  {
    name: 'modifyPolicyBlacklist',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'uint64', name: 'policyId' },
      { type: 'address', name: 'account' },
      { type: 'bool', name: 'restricted' },
    ],
    outputs: [],
  },
  {
    name: 'createCompoundPolicy',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'uint64', name: 'senderPolicyId' },
      { type: 'uint64', name: 'recipientPolicyId' },
      { type: 'uint64', name: 'mintRecipientPolicyId' },
    ],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'setReceivePolicy',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'uint64', name: 'senderPolicyId' },
      { type: 'uint64', name: 'tokenFilterId' },
      { type: 'address', name: 'recoveryAuthority' },
    ],
    outputs: [],
  },
  {
    name: 'migrateTransferPolicyIds',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'address[]', name: 'tokens' }],
    outputs: [{ type: 'uint256', name: 'migrated' }],
  },
  {
    name: 'PolicyAdminUpdated',
    type: 'event',
    inputs: [
      { type: 'uint64', name: 'policyId', indexed: true },
      { type: 'address', name: 'updater', indexed: true },
      { type: 'address', name: 'admin', indexed: true },
    ],
  },
  {
    name: 'PolicyCreated',
    type: 'event',
    inputs: [
      { type: 'uint64', name: 'policyId', indexed: true },
      { type: 'address', name: 'updater', indexed: true },
      { type: 'uint8', name: 'policyType' },
    ],
  },
  {
    name: 'WhitelistUpdated',
    type: 'event',
    inputs: [
      { type: 'uint64', name: 'policyId', indexed: true },
      { type: 'address', name: 'updater', indexed: true },
      { type: 'address', name: 'account', indexed: true },
      { type: 'bool', name: 'allowed' },
    ],
  },
  {
    name: 'BlacklistUpdated',
    type: 'event',
    inputs: [
      { type: 'uint64', name: 'policyId', indexed: true },
      { type: 'address', name: 'updater', indexed: true },
      { type: 'address', name: 'account', indexed: true },
      { type: 'bool', name: 'restricted' },
    ],
  },
  {
    name: 'CompoundPolicyCreated',
    type: 'event',
    inputs: [
      { type: 'uint64', name: 'policyId', indexed: true },
      { type: 'address', name: 'creator', indexed: true },
      { type: 'uint64', name: 'senderPolicyId' },
      { type: 'uint64', name: 'recipientPolicyId' },
      { type: 'uint64', name: 'mintRecipientPolicyId' },
    ],
  },
  {
    name: 'ReceivePolicyUpdated',
    type: 'event',
    inputs: [
      { type: 'address', name: 'account', indexed: true },
      { type: 'uint64', name: 'senderPolicyId' },
      { type: 'uint64', name: 'tokenFilterId' },
      { type: 'address', name: 'recoveryAuthority' },
    ],
  },
  { name: 'Unauthorized', type: 'error', inputs: [] },
  { name: 'PolicyNotFound', type: 'error', inputs: [] },
  { name: 'PolicyNotSimple', type: 'error', inputs: [] },
  { name: 'InvalidPolicyType', type: 'error', inputs: [] },
  { name: 'IncompatiblePolicyType', type: 'error', inputs: [] },
  { name: 'VirtualAddressNotAllowed', type: 'error', inputs: [] },
  { name: 'InvalidReceivePolicyType', type: 'error', inputs: [] },
  { name: 'InvalidRecoveryAuthority', type: 'error', inputs: [] },
] as const

export const validatorConfigV2 = [
  {
    name: 'getActiveValidators',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [
      {
        type: 'tuple[]',
        name: 'validators',
        components: [
          { type: 'bytes32', name: 'publicKey' },
          { type: 'address', name: 'validatorAddress' },
          { type: 'string', name: 'ingress' },
          { type: 'string', name: 'egress' },
          { type: 'address', name: 'feeRecipient' },
          { type: 'uint64', name: 'index' },
          { type: 'uint64', name: 'addedAtHeight' },
          { type: 'uint64', name: 'deactivatedAtHeight' },
        ],
      },
    ],
  },
  {
    name: 'getInitializedAtHeight',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'owner',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'address' }],
  },
  {
    name: 'validatorCount',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'validatorByIndex',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'uint64', name: 'index' }],
    outputs: [
      {
        type: 'tuple',
        components: [
          { type: 'bytes32', name: 'publicKey' },
          { type: 'address', name: 'validatorAddress' },
          { type: 'string', name: 'ingress' },
          { type: 'string', name: 'egress' },
          { type: 'address', name: 'feeRecipient' },
          { type: 'uint64', name: 'index' },
          { type: 'uint64', name: 'addedAtHeight' },
          { type: 'uint64', name: 'deactivatedAtHeight' },
        ],
      },
    ],
  },
  {
    name: 'validatorByAddress',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'address', name: 'validatorAddress' }],
    outputs: [
      {
        type: 'tuple',
        components: [
          { type: 'bytes32', name: 'publicKey' },
          { type: 'address', name: 'validatorAddress' },
          { type: 'string', name: 'ingress' },
          { type: 'string', name: 'egress' },
          { type: 'address', name: 'feeRecipient' },
          { type: 'uint64', name: 'index' },
          { type: 'uint64', name: 'addedAtHeight' },
          { type: 'uint64', name: 'deactivatedAtHeight' },
        ],
      },
    ],
  },
  {
    name: 'validatorByPublicKey',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'bytes32', name: 'publicKey' }],
    outputs: [
      {
        type: 'tuple',
        components: [
          { type: 'bytes32', name: 'publicKey' },
          { type: 'address', name: 'validatorAddress' },
          { type: 'string', name: 'ingress' },
          { type: 'string', name: 'egress' },
          { type: 'address', name: 'feeRecipient' },
          { type: 'uint64', name: 'index' },
          { type: 'uint64', name: 'addedAtHeight' },
          { type: 'uint64', name: 'deactivatedAtHeight' },
        ],
      },
    ],
  },
  {
    name: 'getNextNetworkIdentityRotationEpoch',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'isInitialized',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'bool' }],
  },
  {
    name: 'addValidator',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'validatorAddress' },
      { type: 'bytes32', name: 'publicKey' },
      { type: 'string', name: 'ingress' },
      { type: 'string', name: 'egress' },
      { type: 'address', name: 'feeRecipient' },
      { type: 'bytes', name: 'signature' },
    ],
    outputs: [{ type: 'uint64', name: 'index' }],
  },
  {
    name: 'deactivateValidator',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'uint64', name: 'idx' }],
    outputs: [],
  },
  {
    name: 'rotateValidator',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'uint64', name: 'idx' },
      { type: 'bytes32', name: 'publicKey' },
      { type: 'string', name: 'ingress' },
      { type: 'string', name: 'egress' },
      { type: 'bytes', name: 'signature' },
    ],
    outputs: [],
  },
  {
    name: 'setFeeRecipient',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'uint64', name: 'idx' },
      { type: 'address', name: 'feeRecipient' },
    ],
    outputs: [],
  },
  {
    name: 'setIpAddresses',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'uint64', name: 'idx' },
      { type: 'string', name: 'ingress' },
      { type: 'string', name: 'egress' },
    ],
    outputs: [],
  },
  {
    name: 'transferValidatorOwnership',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'uint64', name: 'idx' },
      { type: 'address', name: 'newAddress' },
    ],
    outputs: [],
  },
  {
    name: 'transferOwnership',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'address', name: 'newOwner' }],
    outputs: [],
  },
  {
    name: 'setNetworkIdentityRotationEpoch',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'uint64', name: 'epoch' }],
    outputs: [],
  },
  {
    name: 'migrateValidator',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'uint64', name: 'idx' }],
    outputs: [],
  },
  {
    name: 'initializeIfMigrated',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [],
    outputs: [],
  },
  {
    name: 'ValidatorAdded',
    type: 'event',
    inputs: [
      { type: 'uint64', name: 'index', indexed: true },
      { type: 'address', name: 'validatorAddress', indexed: true },
      { type: 'bytes32', name: 'publicKey' },
      { type: 'string', name: 'ingress' },
      { type: 'string', name: 'egress' },
      { type: 'address', name: 'feeRecipient' },
    ],
  },
  {
    name: 'ValidatorDeactivated',
    type: 'event',
    inputs: [
      { type: 'uint64', name: 'index', indexed: true },
      { type: 'address', name: 'validatorAddress', indexed: true },
    ],
  },
  {
    name: 'ValidatorRotated',
    type: 'event',
    inputs: [
      { type: 'uint64', name: 'index', indexed: true },
      { type: 'uint64', name: 'deactivatedIndex', indexed: true },
      { type: 'address', name: 'validatorAddress', indexed: true },
      { type: 'bytes32', name: 'oldPublicKey' },
      { type: 'bytes32', name: 'newPublicKey' },
      { type: 'string', name: 'ingress' },
      { type: 'string', name: 'egress' },
      { type: 'address', name: 'caller' },
    ],
  },
  {
    name: 'FeeRecipientUpdated',
    type: 'event',
    inputs: [
      { type: 'uint64', name: 'index', indexed: true },
      { type: 'address', name: 'feeRecipient' },
      { type: 'address', name: 'caller' },
    ],
  },
  {
    name: 'IpAddressesUpdated',
    type: 'event',
    inputs: [
      { type: 'uint64', name: 'index', indexed: true },
      { type: 'string', name: 'ingress' },
      { type: 'string', name: 'egress' },
      { type: 'address', name: 'caller' },
    ],
  },
  {
    name: 'ValidatorOwnershipTransferred',
    type: 'event',
    inputs: [
      { type: 'uint64', name: 'index', indexed: true },
      { type: 'address', name: 'oldAddress', indexed: true },
      { type: 'address', name: 'newAddress', indexed: true },
      { type: 'address', name: 'caller' },
    ],
  },
  {
    name: 'OwnershipTransferred',
    type: 'event',
    inputs: [
      { type: 'address', name: 'oldOwner', indexed: true },
      { type: 'address', name: 'newOwner', indexed: true },
    ],
  },
  {
    name: 'ValidatorMigrated',
    type: 'event',
    inputs: [
      { type: 'uint64', name: 'index', indexed: true },
      { type: 'address', name: 'validatorAddress', indexed: true },
      { type: 'bytes32', name: 'publicKey' },
    ],
  },
  {
    name: 'NetworkIdentityRotationEpochSet',
    type: 'event',
    inputs: [
      { type: 'uint64', name: 'previousEpoch', indexed: true },
      { type: 'uint64', name: 'nextEpoch', indexed: true },
    ],
  },
  {
    name: 'Initialized',
    type: 'event',
    inputs: [{ type: 'uint64', name: 'height' }],
  },
  {
    name: 'SkippedValidatorMigration',
    type: 'event',
    inputs: [
      { type: 'uint64', name: 'index', indexed: true },
      { type: 'address', name: 'validatorAddress', indexed: true },
      { type: 'bytes32', name: 'publicKey' },
    ],
  },
  { name: 'AlreadyInitialized', type: 'error', inputs: [] },
  {
    name: 'IngressAlreadyExists',
    type: 'error',
    inputs: [{ type: 'string', name: 'ingress' }],
  },
  { name: 'EmptyV1ValidatorSet', type: 'error', inputs: [] },
  { name: 'InvalidMigrationIndex', type: 'error', inputs: [] },
  { name: 'InvalidOwner', type: 'error', inputs: [] },
  { name: 'InvalidPublicKey', type: 'error', inputs: [] },
  { name: 'InvalidSignature', type: 'error', inputs: [] },
  { name: 'InvalidSignatureFormat', type: 'error', inputs: [] },
  { name: 'InvalidValidatorAddress', type: 'error', inputs: [] },
  { name: 'MigrationNotComplete', type: 'error', inputs: [] },
  { name: 'NotInitialized', type: 'error', inputs: [] },
  {
    name: 'NotIp',
    type: 'error',
    inputs: [
      { type: 'string', name: 'input' },
      { type: 'string', name: 'backtrace' },
    ],
  },
  {
    name: 'NotIpPort',
    type: 'error',
    inputs: [
      { type: 'string', name: 'input' },
      { type: 'string', name: 'backtrace' },
    ],
  },
  { name: 'PublicKeyAlreadyExists', type: 'error', inputs: [] },
  { name: 'Unauthorized', type: 'error', inputs: [] },
  { name: 'AddressAlreadyHasValidator', type: 'error', inputs: [] },
  { name: 'ValidatorAlreadyDeactivated', type: 'error', inputs: [] },
  { name: 'ValidatorNotFound', type: 'error', inputs: [] },
] as const

export const validatorConfig = [
  {
    name: 'getValidators',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [
      {
        type: 'tuple[]',
        name: 'validators',
        components: [
          { type: 'bytes32', name: 'publicKey' },
          { type: 'bool', name: 'active' },
          { type: 'uint64', name: 'index' },
          { type: 'address', name: 'validatorAddress' },
          { type: 'string', name: 'inboundAddress' },
          { type: 'string', name: 'outboundAddress' },
        ],
      },
    ],
  },
  {
    name: 'addValidator',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'newValidatorAddress' },
      { type: 'bytes32', name: 'publicKey' },
      { type: 'bool', name: 'active' },
      { type: 'string', name: 'inboundAddress' },
      { type: 'string', name: 'outboundAddress' },
    ],
    outputs: [],
  },
  {
    name: 'updateValidator',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'newValidatorAddress' },
      { type: 'bytes32', name: 'publicKey' },
      { type: 'string', name: 'inboundAddress' },
      { type: 'string', name: 'outboundAddress' },
    ],
    outputs: [],
  },
  {
    name: 'changeValidatorStatus',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'validator' },
      { type: 'bool', name: 'active' },
    ],
    outputs: [],
  },
  {
    name: 'changeValidatorStatusByIndex',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'uint64', name: 'index' },
      { type: 'bool', name: 'active' },
    ],
    outputs: [],
  },
  {
    name: 'owner',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'address' }],
  },
  {
    name: 'changeOwner',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'address', name: 'newOwner' }],
    outputs: [],
  },
  {
    name: 'getNextFullDkgCeremony',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'setNextFullDkgCeremony',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'uint64', name: 'epoch' }],
    outputs: [],
  },
  {
    name: 'validatorsArray',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'uint256', name: 'index' }],
    outputs: [{ type: 'address' }],
  },
  {
    name: 'validators',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'address', name: 'validator' }],
    outputs: [
      {
        type: 'tuple',
        components: [
          { type: 'bytes32', name: 'publicKey' },
          { type: 'bool', name: 'active' },
          { type: 'uint64', name: 'index' },
          { type: 'address', name: 'validatorAddress' },
          { type: 'string', name: 'inboundAddress' },
          { type: 'string', name: 'outboundAddress' },
        ],
      },
    ],
  },
  {
    name: 'validatorCount',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint64' }],
  },
  { name: 'Unauthorized', type: 'error', inputs: [] },
  { name: 'ValidatorAlreadyExists', type: 'error', inputs: [] },
  { name: 'ValidatorNotFound', type: 'error', inputs: [] },
  { name: 'InvalidPublicKey', type: 'error', inputs: [] },
  {
    name: 'NotHostPort',
    type: 'error',
    inputs: [
      { type: 'string', name: 'field' },
      { type: 'string', name: 'input' },
      { type: 'string', name: 'backtrace' },
    ],
  },
  {
    name: 'NotIpPort',
    type: 'error',
    inputs: [
      { type: 'string', name: 'field' },
      { type: 'string', name: 'input' },
      { type: 'string', name: 'backtrace' },
    ],
  },
] as const

export const zoneFactory = [
  {
    name: 'owner',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'address' }],
  },
  {
    name: 'transferOwnership',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'address', name: 'newOwner' }],
    outputs: [],
  },
  {
    name: 'createZone',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      {
        type: 'tuple',
        name: 'params',
        components: [
          { type: 'address', name: 'initialToken' },
          { type: 'bool', name: 'accessMode' },
          { type: 'bool', name: 'gatewayMode' },
          { type: 'address[]', name: 'allowedAccounts' },
          { type: 'address[]', name: 'zoneGateways' },
          { type: 'address', name: 'admin' },
          { type: 'address[]', name: 'sequencers' },
          { type: 'uint8', name: 'threshold' },
          { type: 'string', name: 'rpcUrl' },
        ],
      },
    ],
    outputs: [
      { type: 'uint32', name: 'zoneId' },
      { type: 'address', name: 'portal' },
    ],
  },
  {
    name: 'nextZoneId',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint32' }],
  },
  {
    name: 'zones',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'uint32', name: 'id' }],
    outputs: [
      {
        type: 'tuple',
        name: 'info',
        components: [
          { type: 'uint32', name: 'zoneId' },
          { type: 'address', name: 'portal' },
          { type: 'bool', name: 'accessMode' },
          { type: 'bool', name: 'gatewayMode' },
          { type: 'address', name: 'admin' },
          { type: 'address[]', name: 'sequencers' },
          { type: 'uint8', name: 'threshold' },
          { type: 'address', name: 'verifier' },
          { type: 'string', name: 'rpcUrl' },
        ],
      },
    ],
  },
  {
    name: 'isZonePortal',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'address', name: 'portal' }],
    outputs: [{ type: 'bool' }],
  },
  {
    name: 'OwnershipTransferred',
    type: 'event',
    inputs: [
      { type: 'address', name: 'previousOwner', indexed: true },
      { type: 'address', name: 'newOwner', indexed: true },
    ],
  },
  {
    name: 'ZoneCreated',
    type: 'event',
    inputs: [
      { type: 'uint32', name: 'zoneId', indexed: true },
      { type: 'address', name: 'portal', indexed: true },
      { type: 'address', name: 'initialToken' },
      { type: 'bool', name: 'accessMode' },
      { type: 'bool', name: 'gatewayMode' },
      { type: 'address', name: 'admin' },
      { type: 'address[]', name: 'sequencers' },
      { type: 'uint8', name: 'threshold' },
      { type: 'address', name: 'verifier' },
    ],
  },
  { name: 'InvalidToken', type: 'error', inputs: [] },
  { name: 'TokenTransferPolicyNotSet', type: 'error', inputs: [] },
  { name: 'InvalidClosedLoopConfig', type: 'error', inputs: [] },
  { name: 'NotOwner', type: 'error', inputs: [] },
  { name: 'InvalidAdmin', type: 'error', inputs: [] },
  { name: 'InvalidSequencerSet', type: 'error', inputs: [] },
  { name: 'AlreadyInitialized', type: 'error', inputs: [] },
  { name: 'TokenMetadataTooLong', type: 'error', inputs: [] },
  { name: 'DuplicateAllowedAccount', type: 'error', inputs: [] },
  { name: 'DuplicateZoneGateway', type: 'error', inputs: [] },
  {
    name: 'ZoneCreated',
    type: 'event',
    inputs: [
      { type: 'uint32', name: 'zoneId', indexed: true },
      { type: 'address', name: 'portal', indexed: true },
      { type: 'address', name: 'messenger', indexed: true },
      { type: 'address', name: 'initialToken' },
      { type: 'address', name: 'admin' },
      { type: 'address', name: 'sequencer' },
      { type: 'address', name: 'verifier' },
      { type: 'bytes32', name: 'genesisBlockHash' },
      { type: 'bytes32', name: 'genesisTempoBlockHash' },
      { type: 'uint64', name: 'genesisTempoBlockNumber' },
    ],
  },
  {
    name: 'createZone',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      {
        type: 'tuple',
        name: 'params',
        components: [
          { type: 'address', name: 'initialToken' },
          { type: 'address', name: 'admin' },
          { type: 'address', name: 'sequencer' },
          { type: 'address', name: 'verifier' },
          {
            type: 'tuple',
            name: 'zoneParams',
            components: [
              { type: 'bytes32', name: 'genesisBlockHash' },
              { type: 'bytes32', name: 'genesisTempoBlockHash' },
              { type: 'uint64', name: 'genesisTempoBlockNumber' },
            ],
          },
          { type: 'string', name: 'rpcUrl' },
        ],
      },
    ],
    outputs: [
      { type: 'uint32', name: 'zoneId' },
      { type: 'address', name: 'portal' },
    ],
  },
  {
    name: 'verifier',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'address' }],
  },
] as const

export const zonePortal = [
  {
    name: 'SequencerSetUpdated',
    type: 'event',
    inputs: [
      { type: 'uint64', name: 'nonce', indexed: true },
      { type: 'uint8', name: 'threshold' },
      { type: 'address[]', name: 'sequencers' },
    ],
  },
  {
    name: 'TokenEnabled',
    type: 'event',
    inputs: [
      { type: 'address', name: 'token', indexed: true },
      { type: 'string', name: 'name' },
      { type: 'string', name: 'symbol' },
      { type: 'string', name: 'currency' },
    ],
  },
  {
    name: 'RoleUpdated',
    type: 'event',
    inputs: [
      { type: 'address', name: 'account', indexed: true },
      { type: 'uint8', name: 'prev' },
      { type: 'uint8', name: 'next' },
    ],
  },
  {
    name: 'EnforcementModesUpdated',
    type: 'event',
    inputs: [
      { type: 'bool', name: 'accessMode' },
      { type: 'bool', name: 'gatewayMode' },
    ],
  },
  {
    name: 'LeaderUpdated',
    type: 'event',
    inputs: [
      { type: 'address', name: 'previousLeader', indexed: true },
      { type: 'address', name: 'newLeader', indexed: true },
      { type: 'uint64', name: 'leaderEpoch', indexed: true },
      { type: 'uint64', name: 'leaderActivationTempoBlock' },
    ],
  },
  {
    name: 'zoneId',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint32' }],
  },
  {
    name: 'admin',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'address' }],
  },
  {
    name: 'messenger',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'address' }],
  },
  {
    name: 'isAccessEnforced',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'bool' }],
  },
  {
    name: 'setAccessMode',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'bool', name: 'enforced' }],
    outputs: [],
  },
  {
    name: 'isGatewayOpen',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'bool' }],
  },
  {
    name: 'setGatewayMode',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'bool', name: 'enforced' }],
    outputs: [],
  },
  {
    name: 'hasRole',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'address', name: 'account' },
      { type: 'uint8', name: 'role' },
    ],
    outputs: [{ type: 'bool' }],
  },
  {
    name: 'setAllowedAccount',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'account' },
      { type: 'bool', name: 'allowed' },
    ],
    outputs: [],
  },
  {
    name: 'setGateway',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'account' },
      { type: 'bool', name: 'allowed' },
    ],
    outputs: [],
  },
  {
    name: 'setPauseGuardian',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'account' },
      { type: 'bool', name: 'allowed' },
    ],
    outputs: [],
  },
  {
    name: 'setSequencerSet',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address[]', name: 'newSequencers' },
      { type: 'uint8', name: 'newThreshold' },
    ],
    outputs: [],
  },
  {
    name: 'verifier',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'address' }],
  },
  {
    name: 'sequencerSetVersion',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'sequencerThreshold',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint8' }],
  },
  {
    name: 'zoneHeight',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint256' }],
  },
  {
    name: 'isSequencer',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'address', name: 'account' }],
    outputs: [{ type: 'bool' }],
  },
  {
    name: 'sequencerCount',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint256' }],
  },
  {
    name: 'sequencerAt',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'uint256', name: 'index' }],
    outputs: [{ type: 'address' }],
  },
  {
    name: 'leader',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'address' }],
  },
  {
    name: 'leaderEpoch',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'leaderActivationTempoBlock',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'setLeader',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'newLeader' },
      { type: 'uint64', name: 'expectedEpoch' },
    ],
    outputs: [],
  },
  {
    name: 'withdrawalBatchIndex',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'blockHash',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'bytes32' }],
  },
  {
    name: 'currentDepositQueueHash',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'bytes32' }],
  },
  {
    name: 'lastSyncedTempoBlockNumber',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'withdrawalQueueHead',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint256' }],
  },
  {
    name: 'withdrawalQueueTail',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint256' }],
  },
  {
    name: 'withdrawalQueueSlot',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'uint256', name: 'queueIndex' }],
    outputs: [{ type: 'bytes32' }],
  },
  {
    name: 'calculateDepositFee',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint128', name: 'fee' }],
  },
  {
    name: 'calculateBouncebackFee',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint128', name: 'fee' }],
  },
  {
    name: 'depositCount',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'lastProcessedDepositNumber',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'FIXED_DEPOSIT_GAS',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'MAX_GAS_FEE_RATE',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint128' }],
  },
  {
    name: 'MAX_TOKENS_ENABLED_PER_TEMPO_BLOCK',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'MAX_TOKEN_METADATA_BYTES',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint256' }],
  },
  {
    name: 'areDepositsActive',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'address', name: 'token' }],
    outputs: [{ type: 'bool' }],
  },
  {
    name: 'tokenConfig',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'address', name: 'token' }],
    outputs: [
      {
        type: 'tuple',
        components: [
          { type: 'bool', name: 'enabled' },
          { type: 'bool', name: 'depositsActive' },
        ],
      },
    ],
  },
  {
    name: 'initialize',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'uint32', name: 'zoneId' },
      { type: 'address', name: 'initialToken' },
      { type: 'bool', name: 'accessMode' },
      { type: 'bool', name: 'gatewayMode' },
      { type: 'address[]', name: 'allowedAccounts' },
      { type: 'address[]', name: 'zoneGateways' },
      { type: 'address', name: 'admin' },
      { type: 'address', name: 'messenger' },
      { type: 'address[]', name: 'sequencers' },
      { type: 'uint8', name: 'threshold' },
      { type: 'address', name: 'verifier' },
      { type: 'string', name: 'rpcUrl' },
    ],
    outputs: [],
  },
  {
    name: 'deliverWithdrawal',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'to' },
      { type: 'address', name: 'token' },
      { type: 'uint128', name: 'amount' },
      { type: 'bytes32', name: 'memo' },
      { type: 'uint64', name: 'gasLimit' },
      { type: 'bytes', name: 'callbackData' },
    ],
    outputs: [],
  },
  {
    name: 'MAX_DEPOSITS_PER_TEMPO_BLOCK',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'MAX_WITHDRAWAL_GAS_LIMIT',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'paused',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'bool' }],
  },
  {
    name: 'pauseExpiry',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'abdicationEffectiveAt',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'uint8', name: 'capability' }],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'processWithdrawals',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      {
        type: 'tuple[]',
        name: 'withdrawals',
        components: [
          { type: 'address', name: 'token' },
          { type: 'bytes32', name: 'senderTag' },
          { type: 'address', name: 'to' },
          { type: 'uint128', name: 'amount' },
          { type: 'bytes32', name: 'memo' },
          { type: 'uint64', name: 'gasLimit' },
          { type: 'uint64', name: 'fallbackNonce' },
          { type: 'bytes', name: 'callbackData' },
          { type: 'bytes', name: 'encryptedSender' },
        ],
      },
      { type: 'bytes32', name: 'remainingQueue' },
    ],
    outputs: [],
  },
  {
    name: 'pause',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [],
    outputs: [],
  },
  {
    name: 'resume',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [],
    outputs: [],
  },
  {
    name: 'abdicate',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'uint8', name: 'capability' }],
    outputs: [],
  },
  {
    name: 'submitBatch',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'uint64', name: 'tempoBlockNumber' },
      { type: 'uint64', name: 'recentTempoBlockNumber' },
      {
        type: 'tuple',
        name: 'blockTransition',
        components: [
          { type: 'bytes32', name: 'prevBlockHash' },
          { type: 'bytes32', name: 'nextBlockHash' },
        ],
      },
      {
        type: 'tuple',
        name: 'depositQueueTransition',
        components: [
          { type: 'bytes32', name: 'prevProcessedHash' },
          { type: 'bytes32', name: 'nextProcessedHash' },
          { type: 'uint64', name: 'prevDepositNumber' },
          { type: 'uint64', name: 'nextDepositNumber' },
        ],
      },
      { type: 'bytes32', name: 'withdrawalQueueHash' },
      { type: 'bytes', name: 'verifierConfig' },
      { type: 'bytes', name: 'proof' },
      { type: 'uint256', name: 'nextZoneHeight' },
      { type: 'bytes[]', name: 'signatures' },
    ],
    outputs: [],
  },
  {
    name: 'enableToken',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'address', name: 'token' }],
    outputs: [],
  },
  {
    name: 'pauseDeposits',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'address', name: 'token' }],
    outputs: [],
  },
  {
    name: 'resumeDeposits',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'address', name: 'token' }],
    outputs: [],
  },
  {
    name: 'setZoneGasRate',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'uint128', name: 'newZoneGasRate' }],
    outputs: [],
  },
  {
    name: 'setMaxTempoGasRate',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'uint128', name: 'newMaxTempoGasRate' }],
    outputs: [],
  },
  {
    name: 'setBouncebackGas',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'uint64', name: 'newBouncebackGas' }],
    outputs: [],
  },
  {
    name: 'transferAdmin',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'address', name: 'newAdmin' }],
    outputs: [],
  },
  {
    name: 'acceptAdmin',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [],
    outputs: [],
  },
  {
    name: 'rpcUrl',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'string' }],
  },
  {
    name: 'setRpcUrl',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'string', name: 'rpcUrl' }],
    outputs: [],
  },
  {
    name: 'deposit',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'token' },
      { type: 'uint128', name: 'amount' },
      { type: 'uint256', name: 'keyIndex' },
      {
        type: 'tuple',
        name: 'encrypted',
        components: [
          { type: 'bytes32', name: 'ephemeralPubkeyX' },
          { type: 'uint8', name: 'ephemeralPubkeyYParity' },
          { type: 'bytes', name: 'ciphertext' },
          { type: 'bytes12', name: 'nonce' },
          { type: 'bytes16', name: 'tag' },
        ],
      },
      { type: 'address', name: 'tempoRefundRecipient' },
    ],
    outputs: [{ type: 'bytes32', name: 'newCurrentDepositQueueHash' }],
  },
  {
    name: 'depositEncrypted',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'token' },
      { type: 'uint128', name: 'amount' },
      { type: 'uint256', name: 'keyIndex' },
      {
        type: 'tuple',
        name: 'encrypted',
        components: [
          { type: 'bytes32', name: 'ephemeralPubkeyX' },
          { type: 'uint8', name: 'ephemeralPubkeyYParity' },
          { type: 'bytes', name: 'ciphertext' },
          { type: 'bytes12', name: 'nonce' },
          { type: 'bytes16', name: 'tag' },
        ],
      },
      { type: 'address', name: 'tempoRefundRecipient' },
    ],
    outputs: [{ type: 'bytes32', name: 'newCurrentDepositQueueHash' }],
  },
  {
    name: 'setSequencerEncryptionKey',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'bytes32', name: 'x' },
      { type: 'uint8', name: 'yParity' },
      { type: 'uint8', name: 'popV' },
      { type: 'bytes32', name: 'popR' },
      { type: 'bytes32', name: 'popS' },
    ],
    outputs: [],
  },
  {
    name: 'isTokenEnabled',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'address', name: 'token' }],
    outputs: [{ type: 'bool' }],
  },
  {
    name: 'enabledTokenCount',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint256' }],
  },
  {
    name: 'enabledTokenAt',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'uint256', name: 'index' }],
    outputs: [{ type: 'address' }],
  },
  {
    name: 'tokenEnablementHash',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'bytes32' }],
  },
  {
    name: 'zoneGasRate',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint128' }],
  },
  {
    name: 'maxTempoGasRate',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint128' }],
  },
  {
    name: 'bouncebackGas',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'pendingAdmin',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'address' }],
  },
  {
    name: 'refunds',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'address', name: 'token' },
      { type: 'address', name: 'owner' },
    ],
    outputs: [{ type: 'uint128' }],
  },
  {
    name: 'sequencerEncryptionKey',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [
      { type: 'bytes32', name: 'x' },
      { type: 'uint8', name: 'yParity' },
      { type: 'address', name: 'pubkey' },
    ],
  },
  {
    name: 'encryptionKeyCount',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint256' }],
  },
  {
    name: 'encryptionKeyAt',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'uint256', name: 'index' }],
    outputs: [
      {
        type: 'tuple',
        name: 'entry',
        components: [
          { type: 'bytes32', name: 'x' },
          { type: 'uint8', name: 'yParity' },
          { type: 'uint64', name: 'activationBlock' },
        ],
      },
    ],
  },
  {
    name: 'isEncryptionKeyValid',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'uint256', name: 'keyIndex' }],
    outputs: [
      { type: 'bool', name: 'valid' },
      { type: 'uint64', name: 'expiresAtBlock' },
    ],
  },
  {
    name: 'encryptionKeyAtBlock',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'uint64', name: 'tempoBlockNumber' }],
    outputs: [
      { type: 'bytes32', name: 'x' },
      { type: 'uint8', name: 'yParity' },
      { type: 'uint256', name: 'keyIndex' },
    ],
  },
  {
    name: 'claimRefund',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'address', name: 'token' }],
    outputs: [{ type: 'uint128', name: 'amount' }],
  },
  {
    name: 'DepositMade',
    type: 'event',
    inputs: [
      { type: 'bytes32', name: 'newCurrentDepositQueueHash', indexed: true },
      { type: 'address', name: 'sender', indexed: true },
      { type: 'address', name: 'token' },
      { type: 'uint128', name: 'netAmount' },
      { type: 'uint128', name: 'fee' },
      { type: 'uint256', name: 'keyIndex' },
      { type: 'bytes32', name: 'ephemeralPubkeyX' },
      { type: 'uint8', name: 'ephemeralPubkeyYParity' },
      { type: 'bytes', name: 'ciphertext' },
      { type: 'bytes12', name: 'nonce' },
      { type: 'bytes16', name: 'tag' },
      { type: 'address', name: 'tempoRefundRecipient' },
      { type: 'uint64', name: 'depositNumber' },
    ],
  },
  {
    name: 'DepositsPaused',
    type: 'event',
    inputs: [{ type: 'address', name: 'token', indexed: true }],
  },
  {
    name: 'DepositsResumed',
    type: 'event',
    inputs: [{ type: 'address', name: 'token', indexed: true }],
  },
  {
    name: 'PortalPaused',
    type: 'event',
    inputs: [{ type: 'address', name: 'account', indexed: true }],
  },
  {
    name: 'PortalResumed',
    type: 'event',
    inputs: [{ type: 'address', name: 'account', indexed: true }],
  },
  {
    name: 'AbdicationScheduled',
    type: 'event',
    inputs: [
      { type: 'uint8', name: 'capability', indexed: true },
      { type: 'uint64', name: 'effectiveAt' },
    ],
  },
  {
    name: 'RpcUrlUpdated',
    type: 'event',
    inputs: [{ type: 'string', name: 'rpcUrl' }],
  },
  {
    name: 'SequencerEncryptionKeyUpdated',
    type: 'event',
    inputs: [
      { type: 'bytes32', name: 'x' },
      { type: 'uint8', name: 'yParity' },
      { type: 'address', name: 'pubkey' },
      { type: 'uint256', name: 'keyIndex' },
      { type: 'uint64', name: 'activationBlock' },
    ],
  },
  {
    name: 'BatchSubmitted',
    type: 'event',
    inputs: [
      { type: 'uint64', name: 'withdrawalBatchIndex', indexed: true },
      { type: 'uint256', name: 'withdrawalQueueIndex', indexed: true },
      { type: 'bytes32', name: 'nextProcessedDepositQueueHash' },
      { type: 'bytes32', name: 'nextBlockHash' },
      { type: 'bytes32', name: 'withdrawalQueueHash' },
      { type: 'uint64', name: 'lastProcessedDepositNumber' },
    ],
  },
  {
    name: 'WithdrawalProcessed',
    type: 'event',
    inputs: [
      { type: 'address', name: 'to', indexed: true },
      { type: 'bytes32', name: 'senderTag', indexed: true },
      { type: 'address', name: 'token' },
      { type: 'uint128', name: 'amount' },
      { type: 'bool', name: 'callbackSuccess' },
    ],
  },
  {
    name: 'WithdrawalBounceBack',
    type: 'event',
    inputs: [
      { type: 'bytes32', name: 'newCurrentDepositQueueHash', indexed: true },
      { type: 'uint64', name: 'fallbackNonce', indexed: true },
      { type: 'address', name: 'token' },
      { type: 'uint128', name: 'amount' },
      { type: 'uint64', name: 'depositNumber' },
    ],
  },
  {
    name: 'DepositBounceBack',
    type: 'event',
    inputs: [
      { type: 'address', name: 'tempoRefundRecipient', indexed: true },
      { type: 'address', name: 'token' },
      { type: 'uint128', name: 'amount' },
      { type: 'uint128', name: 'bouncebackFee' },
    ],
  },
  {
    name: 'DepositBounceBackPending',
    type: 'event',
    inputs: [
      { type: 'address', name: 'tempoRefundRecipient', indexed: true },
      { type: 'address', name: 'token' },
      { type: 'uint128', name: 'amount' },
      { type: 'uint128', name: 'bouncebackFee' },
    ],
  },
  {
    name: 'RefundClaimed',
    type: 'event',
    inputs: [
      { type: 'address', name: 'recipient', indexed: true },
      { type: 'address', name: 'token', indexed: true },
      { type: 'uint128', name: 'amount' },
    ],
  },
  {
    name: 'ZoneGasRateUpdated',
    type: 'event',
    inputs: [{ type: 'uint128', name: 'zoneGasRate' }],
  },
  {
    name: 'MaxTempoGasRateUpdated',
    type: 'event',
    inputs: [{ type: 'uint128', name: 'maxTempoGasRate' }],
  },
  {
    name: 'BouncebackGasUpdated',
    type: 'event',
    inputs: [{ type: 'uint64', name: 'bouncebackGas' }],
  },
  {
    name: 'AdminTransferStarted',
    type: 'event',
    inputs: [
      { type: 'address', name: 'currentAdmin', indexed: true },
      { type: 'address', name: 'pendingAdmin', indexed: true },
    ],
  },
  {
    name: 'AdminTransferred',
    type: 'event',
    inputs: [
      { type: 'address', name: 'previousAdmin', indexed: true },
      { type: 'address', name: 'newAdmin', indexed: true },
    ],
  },
  { name: 'NotSequencer', type: 'error', inputs: [] },
  { name: 'NotAdmin', type: 'error', inputs: [] },
  { name: 'NotPauseAuthority', type: 'error', inputs: [] },
  {
    name: 'CapabilityAbdicated',
    type: 'error',
    inputs: [{ type: 'uint8', name: 'capability' }],
  },
  {
    name: 'AbdicationAlreadyScheduled',
    type: 'error',
    inputs: [{ type: 'uint8', name: 'capability' }],
  },
  { name: 'PortalIsPaused', type: 'error', inputs: [] },
  { name: 'NotPendingAdmin', type: 'error', inputs: [] },
  { name: 'InvalidProof', type: 'error', inputs: [] },
  { name: 'InvalidTempoBlockNumber', type: 'error', inputs: [] },
  { name: 'NotFactory', type: 'error', inputs: [] },
  { name: 'NotSelf', type: 'error', inputs: [] },
  { name: 'AlreadyInitialized', type: 'error', inputs: [] },
  { name: 'MustDelegateCall', type: 'error', inputs: [] },
  { name: 'CallbackRejected', type: 'error', inputs: [] },
  { name: 'TransferFailed', type: 'error', inputs: [] },
  { name: 'ReentrantWithdrawal', type: 'error', inputs: [] },
  {
    name: 'EncryptionKeyExpired',
    type: 'error',
    inputs: [
      { type: 'uint256', name: 'keyIndex' },
      { type: 'uint64', name: 'activationBlock' },
      { type: 'uint64', name: 'supersededAtBlock' },
    ],
  },
  {
    name: 'InvalidEncryptionKeyIndex',
    type: 'error',
    inputs: [{ type: 'uint256', name: 'keyIndex' }],
  },
  { name: 'NoEncryptionKeySet', type: 'error', inputs: [] },
  {
    name: 'NoEncryptionKeyAtBlock',
    type: 'error',
    inputs: [{ type: 'uint64', name: 'blockNumber' }],
  },
  { name: 'InvalidEphemeralPubkey', type: 'error', inputs: [] },
  {
    name: 'InvalidCiphertextLength',
    type: 'error',
    inputs: [
      { type: 'uint256', name: 'actual' },
      { type: 'uint256', name: 'expected' },
    ],
  },
  { name: 'InvalidProofOfPossession', type: 'error', inputs: [] },
  { name: 'DepositTooSmall', type: 'error', inputs: [] },
  {
    name: 'TokenEnablementBlockCapacityExceeded',
    type: 'error',
    inputs: [{ type: 'uint64', name: 'maximum' }],
  },
  { name: 'TokenMetadataTooLong', type: 'error', inputs: [] },
  { name: 'GasFeeRateTooHigh', type: 'error', inputs: [] },
  { name: 'DepositsNotActive', type: 'error', inputs: [] },
  { name: 'TokenAlreadyEnabled', type: 'error', inputs: [] },
  { name: 'TokenTransferPolicyNotSet', type: 'error', inputs: [] },
  { name: 'InvalidDepositTransition', type: 'error', inputs: [] },
  { name: 'InvalidSequencerSet', type: 'error', inputs: [] },
  { name: 'SequencerConfigurationUnchanged', type: 'error', inputs: [] },
  { name: 'InvalidQuorumCertificate', type: 'error', inputs: [] },
  { name: 'CallbackDidNotReturnToZone', type: 'error', inputs: [] },
  { name: 'InvalidBouncebackRecipient', type: 'error', inputs: [] },
  { name: 'TokenNotEnabled', type: 'error', inputs: [] },
  {
    name: 'DepositBlockCapacityExceeded',
    type: 'error',
    inputs: [{ type: 'uint64', name: 'maximum' }],
  },
  { name: 'InvalidCallbackTarget', type: 'error', inputs: [] },
  {
    name: 'AccountNotAllowed',
    type: 'error',
    inputs: [{ type: 'address', name: 'account' }],
  },
  { name: 'InvalidLeader', type: 'error', inputs: [] },
  { name: 'ActiveLeaderRemoved', type: 'error', inputs: [] },
  { name: 'LeaderAlreadyUpdatedThisBlock', type: 'error', inputs: [] },
  {
    name: 'StaleLeadershipEpoch',
    type: 'error',
    inputs: [
      { type: 'uint64', name: 'expected' },
      { type: 'uint64', name: 'actual' },
    ],
  },
  {
    name: 'deposit',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: '_token' },
      { type: 'address', name: 'to' },
      { type: 'uint128', name: 'amount' },
      { type: 'bytes32', name: 'memo' },
      { type: 'address', name: 'tempoRefundRecipient' },
    ],
    outputs: [{ type: 'bytes32' }],
  },
] as const

// Source: tempoxyz/earn@e8c4c47216b61e727524e5283daf2c7b76f516f7

export const earnContributionController = [
  {
    type: 'constructor',
    inputs: [
      { name: 'earnVault_', type: 'address' },
      { name: 'owner_', type: 'address' },
    ],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'acceptOwnership',
    inputs: [],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'active',
    inputs: [],
    outputs: [{ name: '', type: 'bool' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'asset',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'earnVault',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'executeFunding',
    inputs: [
      { name: 'funder', type: 'address' },
      { name: 'requestedAssets', type: 'uint256' },
      { name: 'maxEarnShareSupply', type: 'uint256' },
    ],
    outputs: [{ name: 'fundedAssets', type: 'uint256' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'fund',
    inputs: [
      { name: 'funder', type: 'address' },
      { name: 'requestedAssets', type: 'uint256' },
      { name: 'maxEarnShareSupply', type: 'uint256' },
    ],
    outputs: [{ name: 'fundedAssets', type: 'uint256' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'owner',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'pendingOwner',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'renounceOwnership',
    inputs: [],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'setActive',
    inputs: [{ name: 'active_', type: 'bool' }],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'transferOwnership',
    inputs: [{ name: 'newOwner', type: 'address' }],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'event',
    name: 'ActiveSet',
    inputs: [{ name: 'active', type: 'bool', indexed: false }],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'Funded',
    inputs: [
      { name: 'funder', type: 'address', indexed: true },
      { name: 'requestedAssets', type: 'uint256', indexed: false },
      { name: 'fundedAssets', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'OwnershipTransferStarted',
    inputs: [
      { name: 'previousOwner', type: 'address', indexed: true },
      { name: 'newOwner', type: 'address', indexed: true },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'OwnershipTransferred',
    inputs: [
      { name: 'previousOwner', type: 'address', indexed: true },
      { name: 'newOwner', type: 'address', indexed: true },
    ],
    anonymous: false,
  },
  {
    type: 'error',
    name: 'EarnShareSupplyOutOfBounds',
    inputs: [
      { name: 'earnShareSupply', type: 'uint256' },
      { name: 'maxEarnShareSupply', type: 'uint256' },
    ],
  },
  { type: 'error', name: 'Inactive', inputs: [] },
  { type: 'error', name: 'NotSelf', inputs: [] },
  {
    type: 'error',
    name: 'OwnableInvalidOwner',
    inputs: [{ name: 'owner', type: 'address' }],
  },
  {
    type: 'error',
    name: 'OwnableUnauthorizedAccount',
    inputs: [{ name: 'account', type: 'address' }],
  },
  { type: 'error', name: 'ReentrantCall', inputs: [] },
  { type: 'error', name: 'TokenCallFailed', inputs: [] },
  { type: 'error', name: 'TokenCallFalse', inputs: [] },
  { type: 'error', name: 'ZeroAddress', inputs: [] },
] as const

export const earnEngine = [
  {
    type: 'function',
    name: 'asset',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'deposit',
    inputs: [{ name: 'assets', type: 'uint256' }],
    outputs: [{ name: 'engineShares', type: 'uint256' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'earnVault',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'name',
    inputs: [],
    outputs: [{ name: '', type: 'string' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'shareScale',
    inputs: [],
    outputs: [{ name: 'scale', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'supportsInterface',
    inputs: [{ name: 'interfaceId', type: 'bytes4' }],
    outputs: [{ name: '', type: 'bool' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'symbol',
    inputs: [],
    outputs: [{ name: '', type: 'string' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'totalAssets',
    inputs: [],
    outputs: [{ name: 'assets', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'totalShares',
    inputs: [],
    outputs: [{ name: 'engineShares', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'valueOf',
    inputs: [{ name: 'engineShares', type: 'uint256' }],
    outputs: [{ name: 'assets', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'previewWithdraw',
    inputs: [{ name: 'assets', type: 'uint256' }],
    outputs: [{ name: 'engineShares', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'withdraw',
    inputs: [
      { name: 'assets', type: 'uint256' },
      { name: 'receiver', type: 'address' },
    ],
    outputs: [{ name: 'engineShares', type: 'uint256' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'isFeeValuationFresh',
    inputs: [],
    outputs: [{ name: '', type: 'bool' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'previewRedeem',
    inputs: [{ name: 'engineShares', type: 'uint256' }],
    outputs: [{ name: 'assets', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'redeem',
    inputs: [
      { name: 'engineShares', type: 'uint256' },
      { name: 'receiver', type: 'address' },
      { name: 'minAssets', type: 'uint256' },
    ],
    outputs: [{ name: 'assets', type: 'uint256' }],
    stateMutability: 'nonpayable',
  },
] as const

export const earnEngineAsyncRedeem = [
  {
    type: 'function',
    name: 'cancelRedeem',
    inputs: [{ name: 'requestId', type: 'bytes32' }],
    outputs: [{ name: 'engineShares', type: 'uint256' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'requestRedeem',
    inputs: [
      { name: 'engineShares', type: 'uint256' },
      { name: 'requestData', type: 'bytes' },
    ],
    outputs: [{ name: 'requestId', type: 'bytes32' }],
    stateMutability: 'nonpayable',
  },
] as const

export const earnEngineInKindDeposit = [
  {
    type: 'function',
    name: 'depositInKind',
    inputs: [
      { name: 'venueShares', type: 'uint256' },
      { name: 'from', type: 'address' },
    ],
    outputs: [{ name: 'engineSharesReceived', type: 'uint256' }],
    stateMutability: 'nonpayable',
  },
] as const

export const earnFactory = [
  {
    type: 'constructor',
    inputs: [
      { name: 'tip20Factory_', type: 'address' },
      { name: 'earnVaultImplementation_', type: 'address' },
      { name: 'earnFeesImplementation_', type: 'address' },
    ],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'DEFAULT_ADMIN_ROLE',
    inputs: [],
    outputs: [{ name: '', type: 'bytes32' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'EARN_SHARE_SALT_DOMAIN',
    inputs: [],
    outputs: [{ name: '', type: 'bytes32' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'FEES_SALT_DOMAIN',
    inputs: [],
    outputs: [{ name: '', type: 'bytes32' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'computeEarnShareSalt',
    inputs: [
      {
        name: 'params',
        type: 'tuple',
        components: [
          { name: 'deploymentId', type: 'bytes32' },
          { name: 'engine', type: 'address' },
          { name: 'owner', type: 'address' },
          {
            name: 'controls',
            type: 'tuple',
            components: [
              { name: 'emergencyGuardian', type: 'address' },
              { name: 'asyncJanitor', type: 'address' },
              { name: 'maxManagedAssets', type: 'uint256' },
              { name: 'migrationMode', type: 'uint8' },
            ],
          },
          {
            name: 'distributorConfig',
            type: 'tuple',
            components: [
              { name: 'distributor', type: 'address' },
              { name: 'updateDelay', type: 'uint40' },
            ],
          },
          {
            name: 'fees',
            type: 'tuple',
            components: [
              { name: 'fixedFeeCount', type: 'uint8' },
              {
                name: 'fixedFees',
                type: 'tuple[4]',
                components: [
                  { name: 'account', type: 'address' },
                  { name: 'rateBps', type: 'uint16' },
                ],
              },
              {
                name: 'excess',
                type: 'tuple',
                components: [
                  { name: 'enabled', type: 'bool' },
                  { name: 'account', type: 'address' },
                  { name: 'annualTargetRateBps', type: 'uint16' },
                  { name: 'excessFeeRateBps', type: 'uint16' },
                ],
              },
            ],
          },
          { name: 'transferPolicyId', type: 'uint64' },
        ],
      },
    ],
    outputs: [{ name: '', type: 'bytes32' }],
    stateMutability: 'pure',
  },
  {
    type: 'function',
    name: 'deploy',
    inputs: [
      {
        name: 'params',
        type: 'tuple',
        components: [
          { name: 'deploymentId', type: 'bytes32' },
          { name: 'engine', type: 'address' },
          { name: 'owner', type: 'address' },
          {
            name: 'controls',
            type: 'tuple',
            components: [
              { name: 'emergencyGuardian', type: 'address' },
              { name: 'asyncJanitor', type: 'address' },
              { name: 'maxManagedAssets', type: 'uint256' },
              { name: 'migrationMode', type: 'uint8' },
            ],
          },
          {
            name: 'distributorConfig',
            type: 'tuple',
            components: [
              { name: 'distributor', type: 'address' },
              { name: 'updateDelay', type: 'uint40' },
            ],
          },
          {
            name: 'fees',
            type: 'tuple',
            components: [
              { name: 'fixedFeeCount', type: 'uint8' },
              {
                name: 'fixedFees',
                type: 'tuple[4]',
                components: [
                  { name: 'account', type: 'address' },
                  { name: 'rateBps', type: 'uint16' },
                ],
              },
              {
                name: 'excess',
                type: 'tuple',
                components: [
                  { name: 'enabled', type: 'bool' },
                  { name: 'account', type: 'address' },
                  { name: 'annualTargetRateBps', type: 'uint16' },
                  { name: 'excessFeeRateBps', type: 'uint16' },
                ],
              },
            ],
          },
          { name: 'transferPolicyId', type: 'uint64' },
        ],
      },
    ],
    outputs: [
      { name: 'earnShare', type: 'address' },
      { name: 'earnVault', type: 'address' },
      { name: 'earnFees', type: 'address' },
    ],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'earnFeesImplementation',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'earnVaultImplementation',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'predictEarnFees',
    inputs: [
      {
        name: 'params',
        type: 'tuple',
        components: [
          { name: 'deploymentId', type: 'bytes32' },
          { name: 'engine', type: 'address' },
          { name: 'owner', type: 'address' },
          {
            name: 'controls',
            type: 'tuple',
            components: [
              { name: 'emergencyGuardian', type: 'address' },
              { name: 'asyncJanitor', type: 'address' },
              { name: 'maxManagedAssets', type: 'uint256' },
              { name: 'migrationMode', type: 'uint8' },
            ],
          },
          {
            name: 'distributorConfig',
            type: 'tuple',
            components: [
              { name: 'distributor', type: 'address' },
              { name: 'updateDelay', type: 'uint40' },
            ],
          },
          {
            name: 'fees',
            type: 'tuple',
            components: [
              { name: 'fixedFeeCount', type: 'uint8' },
              {
                name: 'fixedFees',
                type: 'tuple[4]',
                components: [
                  { name: 'account', type: 'address' },
                  { name: 'rateBps', type: 'uint16' },
                ],
              },
              {
                name: 'excess',
                type: 'tuple',
                components: [
                  { name: 'enabled', type: 'bool' },
                  { name: 'account', type: 'address' },
                  { name: 'annualTargetRateBps', type: 'uint16' },
                  { name: 'excessFeeRateBps', type: 'uint16' },
                ],
              },
            ],
          },
          { name: 'transferPolicyId', type: 'uint64' },
        ],
      },
    ],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'predictEarnShare',
    inputs: [
      {
        name: 'params',
        type: 'tuple',
        components: [
          { name: 'deploymentId', type: 'bytes32' },
          { name: 'engine', type: 'address' },
          { name: 'owner', type: 'address' },
          {
            name: 'controls',
            type: 'tuple',
            components: [
              { name: 'emergencyGuardian', type: 'address' },
              { name: 'asyncJanitor', type: 'address' },
              { name: 'maxManagedAssets', type: 'uint256' },
              { name: 'migrationMode', type: 'uint8' },
            ],
          },
          {
            name: 'distributorConfig',
            type: 'tuple',
            components: [
              { name: 'distributor', type: 'address' },
              { name: 'updateDelay', type: 'uint40' },
            ],
          },
          {
            name: 'fees',
            type: 'tuple',
            components: [
              { name: 'fixedFeeCount', type: 'uint8' },
              {
                name: 'fixedFees',
                type: 'tuple[4]',
                components: [
                  { name: 'account', type: 'address' },
                  { name: 'rateBps', type: 'uint16' },
                ],
              },
              {
                name: 'excess',
                type: 'tuple',
                components: [
                  { name: 'enabled', type: 'bool' },
                  { name: 'account', type: 'address' },
                  { name: 'annualTargetRateBps', type: 'uint16' },
                  { name: 'excessFeeRateBps', type: 'uint16' },
                ],
              },
            ],
          },
          { name: 'transferPolicyId', type: 'uint64' },
        ],
      },
    ],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'tip20Factory',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'event',
    name: 'EarnStackDeployed',
    inputs: [
      { name: 'earnVault', type: 'address', indexed: true },
      { name: 'earnShare', type: 'address', indexed: true },
      { name: 'earnFees', type: 'address', indexed: true },
      { name: 'engine', type: 'address', indexed: false },
      { name: 'asset', type: 'address', indexed: false },
      { name: 'owner', type: 'address', indexed: false },
      { name: 'deploymentId', type: 'bytes32', indexed: false },
      { name: 'emergencyGuardian', type: 'address', indexed: false },
      { name: 'asyncJanitor', type: 'address', indexed: false },
      { name: 'maxManagedAssets', type: 'uint256', indexed: false },
      { name: 'migrationMode', type: 'uint8', indexed: false },
      { name: 'transferPolicyId', type: 'uint64', indexed: false },
      { name: 'earnShareSalt', type: 'bytes32', indexed: false },
      { name: 'controlConfigHash', type: 'bytes32', indexed: false },
      { name: 'feeConfigHash', type: 'bytes32', indexed: false },
      { name: 'earnFeesSalt', type: 'bytes32', indexed: false },
    ],
    anonymous: false,
  },
  { type: 'error', name: 'AdminRelinquishmentFailed', inputs: [] },
  {
    type: 'error',
    name: 'EarnShareAlreadyExists',
    inputs: [{ name: 'earnShare', type: 'address' }],
  },
  { type: 'error', name: 'EarnShareSupplyNotZero', inputs: [] },
  { type: 'error', name: 'EmptyDeploymentId', inputs: [] },
  { type: 'error', name: 'EmptyEarnShareMetadata', inputs: [] },
  {
    type: 'error',
    name: 'EngineAlreadyBound',
    inputs: [{ name: 'earnVault', type: 'address' }],
  },
  { type: 'error', name: 'FactoryCannotBeFinalOwner', inputs: [] },
  { type: 'error', name: 'FailedDeployment', inputs: [] },
  {
    type: 'error',
    name: 'InsufficientBalance',
    inputs: [
      { name: 'balance', type: 'uint256' },
      { name: 'needed', type: 'uint256' },
    ],
  },
  { type: 'error', name: 'InvalidDistributorConfig', inputs: [] },
  { type: 'error', name: 'InvalidEarnFeesImplementation', inputs: [] },
  { type: 'error', name: 'InvalidEarnVaultImplementation', inputs: [] },
  { type: 'error', name: 'InvalidEngine', inputs: [] },
  {
    type: 'error',
    name: 'InvalidTransferPolicy',
    inputs: [{ name: 'policyId', type: 'uint64' }],
  },
  { type: 'error', name: 'IssuerGrantFailed', inputs: [] },
  {
    type: 'error',
    name: 'TransferPolicyMismatch',
    inputs: [
      { name: 'expected', type: 'uint64' },
      { name: 'actual', type: 'uint64' },
    ],
  },
  {
    type: 'error',
    name: 'UnsupportedTransferPolicy',
    inputs: [
      { name: 'policyId', type: 'uint64' },
      { name: 'policyType', type: 'uint8' },
    ],
  },
  { type: 'error', name: 'ZeroAddress', inputs: [] },
] as const

export const earnFees = [
  { type: 'constructor', inputs: [], stateMutability: 'nonpayable' },
  {
    type: 'function',
    name: 'accrueFees',
    inputs: [],
    outputs: [
      {
        name: 'result',
        type: 'tuple',
        components: [
          { name: 'activeAssets', type: 'uint256' },
          { name: 'positiveAccrualAssets', type: 'uint256' },
          { name: 'fixedFeeAssets', type: 'uint256' },
          { name: 'excessFeeAssets', type: 'uint256' },
          { name: 'totalFeeAssets', type: 'uint256' },
          { name: 'totalFeeEarnShares', type: 'uint256' },
          { name: 'preFeeValuePerEarnShare', type: 'uint256' },
          { name: 'postFeeValuePerEarnShare', type: 'uint256' },
          { name: 'targetValuePerEarnShare', type: 'uint256' },
          { name: 'allocationCount', type: 'uint8' },
          {
            name: 'allocations',
            type: 'tuple[5]',
            components: [
              { name: 'account', type: 'address' },
              { name: 'feeAssets', type: 'uint256' },
              { name: 'feeEarnShares', type: 'uint256' },
            ],
          },
        ],
      },
    ],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'claim',
    inputs: [
      { name: 'to', type: 'address' },
      { name: 'earnShares', type: 'uint256' },
    ],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'claimableEarnShares',
    inputs: [{ name: 'recipient', type: 'address' }],
    outputs: [{ name: 'earnShares', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'closeRedeemRequest',
    inputs: [{ name: 'requestId', type: 'bytes32' }],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'currentFeeConfigId',
    inputs: [],
    outputs: [{ name: '', type: 'uint64' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'disableFees',
    inputs: [{ name: 'operator', type: 'address' }],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'earnShare',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'earnShareScale',
    inputs: [],
    outputs: [{ name: '', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'earnVault',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'feeBaselinesPending',
    inputs: [],
    outputs: [{ name: '', type: 'bool' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'feeConfig',
    inputs: [{ name: 'configId', type: 'uint64' }],
    outputs: [
      {
        name: '',
        type: 'tuple',
        components: [
          { name: 'fixedFeeCount', type: 'uint8' },
          {
            name: 'fixedFees',
            type: 'tuple[4]',
            components: [
              { name: 'account', type: 'address' },
              { name: 'rateBps', type: 'uint16' },
            ],
          },
          {
            name: 'excess',
            type: 'tuple',
            components: [
              { name: 'enabled', type: 'bool' },
              { name: 'account', type: 'address' },
              { name: 'annualTargetRateBps', type: 'uint16' },
              { name: 'excessFeeRateBps', type: 'uint16' },
            ],
          },
        ],
      },
    ],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'feeRemainder',
    inputs: [
      { name: 'configId', type: 'uint64' },
      { name: 'slot', type: 'uint8' },
    ],
    outputs: [{ name: '', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'feesActive',
    inputs: [],
    outputs: [{ name: '', type: 'bool' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'feesDisabled',
    inputs: [],
    outputs: [{ name: '', type: 'bool' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'highWaterMark',
    inputs: [],
    outputs: [{ name: '', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'initialize',
    inputs: [
      { name: 'earnVault_', type: 'address' },
      { name: 'earnShare_', type: 'address' },
      {
        name: 'initialConfig',
        type: 'tuple',
        components: [
          { name: 'fixedFeeCount', type: 'uint8' },
          {
            name: 'fixedFees',
            type: 'tuple[4]',
            components: [
              { name: 'account', type: 'address' },
              { name: 'rateBps', type: 'uint16' },
            ],
          },
          {
            name: 'excess',
            type: 'tuple',
            components: [
              { name: 'enabled', type: 'bool' },
              { name: 'account', type: 'address' },
              { name: 'annualTargetRateBps', type: 'uint16' },
              { name: 'excessFeeRateBps', type: 'uint16' },
            ],
          },
        ],
      },
    ],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'initializeBaselines',
    inputs: [],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'pendingFeeSnapshot',
    inputs: [{ name: 'requestId', type: 'bytes32' }],
    outputs: [
      {
        name: '',
        type: 'tuple',
        components: [
          { name: 'burnedEarnShares', type: 'uint256' },
          { name: 'requestValue', type: 'uint256' },
          { name: 'highWaterValue', type: 'uint256' },
          { name: 'targetValue', type: 'uint256' },
          { name: 'feeConfigId', type: 'uint64' },
          { name: 'requestedAt', type: 'uint40' },
          { name: 'open', type: 'bool' },
        ],
      },
    ],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'previewAccruedFees',
    inputs: [],
    outputs: [
      {
        name: 'result',
        type: 'tuple',
        components: [
          { name: 'activeAssets', type: 'uint256' },
          { name: 'positiveAccrualAssets', type: 'uint256' },
          { name: 'fixedFeeAssets', type: 'uint256' },
          { name: 'excessFeeAssets', type: 'uint256' },
          { name: 'totalFeeAssets', type: 'uint256' },
          { name: 'totalFeeEarnShares', type: 'uint256' },
          { name: 'preFeeValuePerEarnShare', type: 'uint256' },
          { name: 'postFeeValuePerEarnShare', type: 'uint256' },
          { name: 'targetValuePerEarnShare', type: 'uint256' },
          { name: 'allocationCount', type: 'uint8' },
          {
            name: 'allocations',
            type: 'tuple[5]',
            components: [
              { name: 'account', type: 'address' },
              { name: 'feeAssets', type: 'uint256' },
              { name: 'feeEarnShares', type: 'uint256' },
            ],
          },
        ],
      },
    ],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'recordRedeemRequest',
    inputs: [
      { name: 'requestId', type: 'bytes32' },
      { name: 'burnedEarnShares', type: 'uint256' },
      { name: 'requestValue', type: 'uint256' },
    ],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'setFeeConfig',
    inputs: [
      {
        name: 'config',
        type: 'tuple',
        components: [
          { name: 'fixedFeeCount', type: 'uint8' },
          {
            name: 'fixedFees',
            type: 'tuple[4]',
            components: [
              { name: 'account', type: 'address' },
              { name: 'rateBps', type: 'uint16' },
            ],
          },
          {
            name: 'excess',
            type: 'tuple',
            components: [
              { name: 'enabled', type: 'bool' },
              { name: 'account', type: 'address' },
              { name: 'annualTargetRateBps', type: 'uint16' },
              { name: 'excessFeeRateBps', type: 'uint16' },
            ],
          },
        ],
      },
    ],
    outputs: [{ name: 'configId', type: 'uint64' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'settleCancelledRedeem',
    inputs: [
      { name: 'requestId', type: 'bytes32' },
      { name: 'returnedValue', type: 'uint256' },
      { name: 'activeSupply', type: 'uint256' },
      { name: 'activeAssets', type: 'uint256' },
      { name: 'totalReentryEarnShares', type: 'uint256' },
    ],
    outputs: [{ name: 'feeEarnShares', type: 'uint256' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'shouldChargeRedeem',
    inputs: [{ name: 'requestId', type: 'bytes32' }],
    outputs: [{ name: '', type: 'bool' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'targetBase',
    inputs: [],
    outputs: [{ name: '', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'targetStartedAt',
    inputs: [],
    outputs: [{ name: '', type: 'uint40' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'totalClaimableEarnShares',
    inputs: [],
    outputs: [{ name: '', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'validateFeeConfig',
    inputs: [
      {
        name: 'config',
        type: 'tuple',
        components: [
          { name: 'fixedFeeCount', type: 'uint8' },
          {
            name: 'fixedFees',
            type: 'tuple[4]',
            components: [
              { name: 'account', type: 'address' },
              { name: 'rateBps', type: 'uint16' },
            ],
          },
          {
            name: 'excess',
            type: 'tuple',
            components: [
              { name: 'enabled', type: 'bool' },
              { name: 'account', type: 'address' },
              { name: 'annualTargetRateBps', type: 'uint16' },
              { name: 'excessFeeRateBps', type: 'uint16' },
            ],
          },
        ],
      },
    ],
    outputs: [],
    stateMutability: 'view',
  },
  {
    type: 'event',
    name: 'FeeBaselinesInitialized',
    inputs: [
      { name: 'highWaterMark', type: 'uint256', indexed: false },
      { name: 'targetBase', type: 'uint256', indexed: false },
      { name: 'targetStartedAt', type: 'uint40', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'FeeConfigurationSet',
    inputs: [
      { name: 'configId', type: 'uint64', indexed: true },
      { name: 'configHash', type: 'bytes32', indexed: true },
      { name: 'reactivated', type: 'bool', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'FeeDustWaived',
    inputs: [
      { name: 'configId', type: 'uint64', indexed: true },
      { name: 'slot', type: 'uint8', indexed: true },
      { name: 'remainder', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'FeeEarnSharesAllocated',
    inputs: [
      { name: 'configId', type: 'uint64', indexed: true },
      { name: 'recipient', type: 'address', indexed: true },
      { name: 'feeAssets', type: 'uint256', indexed: false },
      { name: 'feeEarnShares', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'FeeEarnSharesClaimed',
    inputs: [
      { name: 'recipient', type: 'address', indexed: true },
      { name: 'to', type: 'address', indexed: true },
      { name: 'earnShares', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'FeesAccrued',
    inputs: [
      { name: 'configId', type: 'uint64', indexed: true },
      { name: 'activeAssets', type: 'uint256', indexed: false },
      { name: 'positiveAccrualAssets', type: 'uint256', indexed: false },
      { name: 'feeAssets', type: 'uint256', indexed: false },
      { name: 'feeEarnShares', type: 'uint256', indexed: false },
      { name: 'highWaterMark', type: 'uint256', indexed: false },
      { name: 'targetValuePerEarnShare', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'FeesDisabled',
    inputs: [{ name: 'operator', type: 'address', indexed: true }],
    anonymous: false,
  },
  { type: 'error', name: 'AlreadyInitialized', inputs: [] },
  { type: 'error', name: 'InsufficientClaimableEarnShares', inputs: [] },
  { type: 'error', name: 'InvalidFeeClaimReceiver', inputs: [] },
  { type: 'error', name: 'InvalidFeeConfiguration', inputs: [] },
  { type: 'error', name: 'NotEarnVault', inputs: [] },
  { type: 'error', name: 'ReentrantCall', inputs: [] },
  { type: 'error', name: 'ZeroAddress', inputs: [] },
  { type: 'error', name: 'ZeroAmount', inputs: [] },
] as const

export const earnMerkleRewardDistributor = [
  {
    type: 'constructor',
    inputs: [
      { name: 'earnVault_', type: 'address' },
      { name: 'treasury_', type: 'address' },
      { name: 'campaignId_', type: 'bytes32' },
      { name: 'claimDeadline_', type: 'uint40' },
      { name: 'owner_', type: 'address' },
    ],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'acceptOwnership',
    inputs: [],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'asset',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'campaignId',
    inputs: [],
    outputs: [{ name: '', type: 'bytes32' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'claim',
    inputs: [
      { name: 'recipient', type: 'address' },
      { name: 'cumulativeAmount', type: 'uint256' },
      { name: 'proof', type: 'bytes32[]' },
    ],
    outputs: [{ name: 'amount', type: 'uint256' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'claimDeadline',
    inputs: [],
    outputs: [{ name: '', type: 'uint40' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'cumulativePaid',
    inputs: [{ name: 'recipient', type: 'address' }],
    outputs: [{ name: 'cumulativeAmount', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'earnShare',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'earnVault',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'fundWithAssets',
    inputs: [
      { name: 'funder', type: 'address' },
      { name: 'assets', type: 'uint256' },
      { name: 'minEarnShares', type: 'uint256' },
    ],
    outputs: [{ name: 'earnShares', type: 'uint256' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'leaf',
    inputs: [
      { name: 'recipient', type: 'address' },
      { name: 'cumulativeAmount', type: 'uint256' },
    ],
    outputs: [{ name: '', type: 'bytes32' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'merkleRoot',
    inputs: [],
    outputs: [{ name: '', type: 'bytes32' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'owner',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'paused',
    inputs: [],
    outputs: [{ name: '', type: 'bool' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'pendingOwner',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'publishRoot',
    inputs: [
      { name: 'root', type: 'bytes32' },
      { name: 'totalEntitlement', type: 'uint256' },
      { name: 'statementHash_', type: 'bytes32' },
    ],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'pushBatch',
    inputs: [
      { name: 'expectedRootVersion', type: 'uint64' },
      { name: 'recipients', type: 'address[]' },
      { name: 'cumulativeAmounts', type: 'uint256[]' },
      { name: 'multiproof', type: 'bytes32[]' },
      { name: 'proofFlags', type: 'bool[]' },
    ],
    outputs: [
      { name: 'paidCount', type: 'uint256' },
      { name: 'paidEarnShares', type: 'uint256' },
      { name: 'skippedCount', type: 'uint256' },
    ],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'renounceOwnership',
    inputs: [],
    outputs: [],
    stateMutability: 'pure',
  },
  {
    type: 'function',
    name: 'returnUnspent',
    inputs: [],
    outputs: [{ name: 'earnShares', type: 'uint256' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'rootTotalEntitlement',
    inputs: [],
    outputs: [{ name: '', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'rootVersion',
    inputs: [],
    outputs: [{ name: '', type: 'uint64' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'setPaused',
    inputs: [{ name: 'paused_', type: 'bool' }],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'statementHash',
    inputs: [],
    outputs: [{ name: '', type: 'bytes32' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'totalPaid',
    inputs: [],
    outputs: [{ name: '', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'transferOwnership',
    inputs: [{ name: 'newOwner', type: 'address' }],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'treasury',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'event',
    name: 'AssetsFunded',
    inputs: [
      { name: 'funder', type: 'address', indexed: true },
      { name: 'assets', type: 'uint256', indexed: false },
      { name: 'earnShares', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'BatchPushed',
    inputs: [
      { name: 'version', type: 'uint64', indexed: true },
      { name: 'batchHash', type: 'bytes32', indexed: true },
      { name: 'attemptedCount', type: 'uint256', indexed: false },
      { name: 'paidCount', type: 'uint256', indexed: false },
      { name: 'paidEarnShares', type: 'uint256', indexed: false },
      { name: 'skippedCount', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'OwnershipTransferStarted',
    inputs: [
      { name: 'previousOwner', type: 'address', indexed: true },
      { name: 'newOwner', type: 'address', indexed: true },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'OwnershipTransferred',
    inputs: [
      { name: 'previousOwner', type: 'address', indexed: true },
      { name: 'newOwner', type: 'address', indexed: true },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'PausedSet',
    inputs: [{ name: 'paused', type: 'bool', indexed: false }],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'PayoutSkipped',
    inputs: [
      { name: 'recipient', type: 'address', indexed: true },
      { name: 'cumulativeAmount', type: 'uint256', indexed: false },
      { name: 'reason', type: 'uint8', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'RewardClaimed',
    inputs: [
      { name: 'recipient', type: 'address', indexed: true },
      { name: 'amount', type: 'uint256', indexed: false },
      { name: 'cumulativeAmount', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'RootPublished',
    inputs: [
      { name: 'version', type: 'uint64', indexed: true },
      { name: 'root', type: 'bytes32', indexed: true },
      { name: 'statementHash', type: 'bytes32', indexed: true },
      { name: 'totalEntitlement', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'UnspentReturned',
    inputs: [
      { name: 'treasury', type: 'address', indexed: true },
      { name: 'earnShares', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  { type: 'error', name: 'ClaimsExpired', inputs: [] },
  { type: 'error', name: 'ClaimsNotExpired', inputs: [] },
  { type: 'error', name: 'DepositsPaused', inputs: [] },
  {
    type: 'error',
    name: 'InsufficientFunding',
    inputs: [
      { name: 'requiredBalance', type: 'uint256' },
      { name: 'actualBalance', type: 'uint256' },
    ],
  },
  { type: 'error', name: 'InvalidArrayLengths', inputs: [] },
  { type: 'error', name: 'InvalidEarnVault', inputs: [] },
  { type: 'error', name: 'InvalidMultiproof', inputs: [] },
  { type: 'error', name: 'MerkleProofInvalidMultiproof', inputs: [] },
  { type: 'error', name: 'NothingOwed', inputs: [] },
  {
    type: 'error',
    name: 'OwnableInvalidOwner',
    inputs: [{ name: 'owner', type: 'address' }],
  },
  {
    type: 'error',
    name: 'OwnableUnauthorizedAccount',
    inputs: [{ name: 'account', type: 'address' }],
  },
  { type: 'error', name: 'OwnershipRenunciationDisabled', inputs: [] },
  { type: 'error', name: 'Paused', inputs: [] },
  { type: 'error', name: 'PausedLiabilityIncrease', inputs: [] },
  { type: 'error', name: 'ReentrancyGuardReentrantCall', inputs: [] },
  {
    type: 'error',
    name: 'RootTotalDecreased',
    inputs: [
      { name: 'previousTotal', type: 'uint256' },
      { name: 'nextTotal', type: 'uint256' },
    ],
  },
  {
    type: 'error',
    name: 'RootTotalExceeded',
    inputs: [
      { name: 'requestedAmount', type: 'uint256' },
      { name: 'remainingEntitlement', type: 'uint256' },
    ],
  },
  {
    type: 'error',
    name: 'StaleRootVersion',
    inputs: [
      { name: 'expected', type: 'uint64' },
      { name: 'actual', type: 'uint64' },
    ],
  },
  { type: 'error', name: 'TokenCallFailed', inputs: [] },
  { type: 'error', name: 'TokenCallFalse', inputs: [] },
  {
    type: 'error',
    name: 'UnexpectedEarnShares',
    inputs: [
      { name: 'reported', type: 'uint256' },
      { name: 'measured', type: 'uint256' },
    ],
  },
  {
    type: 'error',
    name: 'UnexpectedRetainedAssets',
    inputs: [
      { name: 'beforeBalance', type: 'uint256' },
      { name: 'afterBalance', type: 'uint256' },
    ],
  },
  { type: 'error', name: 'ZeroAddress', inputs: [] },
  { type: 'error', name: 'ZeroAmount', inputs: [] },
  { type: 'error', name: 'ZeroCampaignId', inputs: [] },
  { type: 'error', name: 'ZeroDeadline', inputs: [] },
  { type: 'error', name: 'ZeroMinimumEarnShares', inputs: [] },
  { type: 'error', name: 'ZeroRoot', inputs: [] },
  { type: 'error', name: 'ZeroStatementHash', inputs: [] },
] as const

export const earnRouter = [
  {
    type: 'constructor',
    inputs: [
      { name: 'allowedZoneId_', type: 'uint32' },
      { name: 'earnVault_', type: 'address' },
      { name: 'privateAsset_', type: 'address' },
      { name: 'tokenAuthority_', type: 'address' },
    ],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'allowedZoneId',
    inputs: [],
    outputs: [{ name: '', type: 'uint32' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'earnShare',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'earnVault',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'onWithdrawalReceived',
    inputs: [
      { name: 'sourceZoneId', type: 'uint32' },
      { name: 'sourcePortal', type: 'address' },
      { name: '', type: 'bytes32' },
      { name: 'token', type: 'address' },
      { name: 'amount', type: 'uint128' },
      { name: 'callbackData', type: 'bytes' },
    ],
    outputs: [{ name: '', type: 'bytes4' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'privateAsset',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'reserveToken',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'supportsFlow',
    inputs: [{ name: 'flow', type: 'uint8' }],
    outputs: [{ name: '', type: 'bool' }],
    stateMutability: 'pure',
  },
  {
    type: 'function',
    name: 'tokenAuthority',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'transactionLimit',
    inputs: [],
    outputs: [{ name: '', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'vaultAsset',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'event',
    name: 'EarnDeposit',
    inputs: [
      { name: 'actionId', type: 'bytes32', indexed: true },
      { name: 'earnVault', type: 'address', indexed: true },
      { name: 'inputToken', type: 'address', indexed: true },
      { name: 'inputAmount', type: 'uint256', indexed: false },
      { name: 'vaultAssets', type: 'uint256', indexed: false },
      { name: 'earnShares', type: 'uint256', indexed: false },
      { name: 'zoneDepositHash', type: 'bytes32', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'EarnRedeem',
    inputs: [
      { name: 'actionId', type: 'bytes32', indexed: true },
      { name: 'earnVault', type: 'address', indexed: true },
      { name: 'outputToken', type: 'address', indexed: true },
      { name: 'earnShares', type: 'uint256', indexed: false },
      { name: 'vaultAssets', type: 'uint256', indexed: false },
      { name: 'outputAmount', type: 'uint256', indexed: false },
      { name: 'zoneDepositHash', type: 'bytes32', indexed: false },
    ],
    anonymous: false,
  },
  { type: 'error', name: 'AmountExceedsLimit', inputs: [] },
  { type: 'error', name: 'AmountOverflow', inputs: [] },
  { type: 'error', name: 'BadFlow', inputs: [] },
  { type: 'error', name: 'InsufficientOutput', inputs: [] },
  { type: 'error', name: 'InvalidAuthority', inputs: [] },
  { type: 'error', name: 'InvalidEarnVault', inputs: [] },
  { type: 'error', name: 'InvalidPrivateAsset', inputs: [] },
  { type: 'error', name: 'InvalidReturnToken', inputs: [] },
  { type: 'error', name: 'InvalidRoutePair', inputs: [] },
  { type: 'error', name: 'InvalidSourcePortal', inputs: [] },
  { type: 'error', name: 'InvalidTransactionLimit', inputs: [] },
  { type: 'error', name: 'NotZoneMessenger', inputs: [] },
  { type: 'error', name: 'ReentrantCall', inputs: [] },
  { type: 'error', name: 'ResidualBalance', inputs: [] },
  { type: 'error', name: 'TokenCallFailed', inputs: [] },
  { type: 'error', name: 'TokenCallFalse', inputs: [] },
  { type: 'error', name: 'WrongInputToken', inputs: [] },
  { type: 'error', name: 'WrongSourceZone', inputs: [] },
  { type: 'error', name: 'ZeroAddress', inputs: [] },
  { type: 'error', name: 'ZeroAmount', inputs: [] },
] as const

export const earnVault = [
  { type: 'constructor', inputs: [], stateMutability: 'nonpayable' },
  {
    type: 'function',
    name: 'MAX_REWARD_RATE_MULTIPLIER',
    inputs: [],
    outputs: [{ name: '', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'absorbEngineShareSurplus',
    inputs: [{ name: 'engineShares_', type: 'uint256' }],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'acceptDistributor',
    inputs: [],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'accrueFees',
    inputs: [],
    outputs: [
      { name: 'feeAssets', type: 'uint256' },
      { name: 'feeEarnShares', type: 'uint256' },
    ],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'anchorEarnShares',
    inputs: [],
    outputs: [{ name: '', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'anchorEngineShares',
    inputs: [],
    outputs: [{ name: '', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'asset',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'asyncJanitor',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'cancelDistributorFeeUpdate',
    inputs: [],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'cancelDistributorTransfer',
    inputs: [],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'cancelRedeem',
    inputs: [
      { name: 'requestId', type: 'bytes32' },
      { name: 'minReceiverEarnShares', type: 'uint256' },
    ],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'contribute',
    inputs: [{ name: 'assets', type: 'uint256' }],
    outputs: [{ name: 'receivedEngineShares', type: 'uint256' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'convertEngineSharesToEarnShares',
    inputs: [{ name: 'engineShares_', type: 'uint256' }],
    outputs: [{ name: 'earnShares', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'convertToEngineShares',
    inputs: [{ name: 'earnShares', type: 'uint256' }],
    outputs: [{ name: 'engineShares_', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'deposit',
    inputs: [
      { name: 'assets', type: 'uint256' },
      { name: 'receiver', type: 'address' },
      { name: 'minEarnShares', type: 'uint256' },
    ],
    outputs: [{ name: 'earnShares', type: 'uint256' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'depositVenueShares',
    inputs: [
      { name: 'venueShares', type: 'uint256' },
      { name: 'receiver', type: 'address' },
      { name: 'minEarnShares', type: 'uint256' },
    ],
    outputs: [{ name: 'earnShares', type: 'uint256' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'depositsPaused',
    inputs: [],
    outputs: [{ name: '', type: 'bool' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'disableFees',
    inputs: [],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'distributor',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'distributorFee',
    inputs: [],
    outputs: [
      { name: 'recipient', type: 'address' },
      { name: 'rateBps', type: 'uint16' },
    ],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'distributorUpdateDelay',
    inputs: [],
    outputs: [{ name: '', type: 'uint40' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'earnFees',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'earnShare',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'emergencyGuardian',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'engine',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'engineMigrationMode',
    inputs: [],
    outputs: [{ name: '', type: 'uint8' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'engineShares',
    inputs: [],
    outputs: [{ name: '', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'executeDistributorFeeUpdate',
    inputs: [],
    outputs: [{ name: 'feeConfigId', type: 'uint64' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'finalizeRedeem',
    inputs: [
      { name: 'requestId', type: 'bytes32' },
      { name: 'asset_', type: 'address' },
      { name: 'amount', type: 'uint256' },
    ],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'initialize',
    inputs: [
      { name: 'engine_', type: 'address' },
      { name: 'earnShare_', type: 'address' },
      { name: 'earnFees_', type: 'address' },
      { name: 'operator_', type: 'address' },
      {
        name: 'controlInit_',
        type: 'tuple',
        components: [
          { name: 'emergencyGuardian', type: 'address' },
          { name: 'asyncJanitor', type: 'address' },
          { name: 'maxManagedAssets', type: 'uint256' },
          { name: 'migrationMode', type: 'uint8' },
        ],
      },
      {
        name: 'distributorInit_',
        type: 'tuple',
        components: [
          { name: 'distributor', type: 'address' },
          { name: 'updateDelay', type: 'uint40' },
        ],
      },
    ],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'isAccountingAligned',
    inputs: [],
    outputs: [{ name: '', type: 'bool' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'isFeeValuationFresh',
    inputs: [],
    outputs: [{ name: '', type: 'bool' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'maxManagedAssets',
    inputs: [],
    outputs: [{ name: '', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'migrateEngine',
    inputs: [
      { name: 'newEngine', type: 'address' },
      { name: 'minNewEngineShares', type: 'uint256' },
      { name: 'minAssetsRetained', type: 'uint256' },
    ],
    outputs: [{ name: 'newEngineShares', type: 'uint256' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'normalizedRewardRate',
    inputs: [],
    outputs: [{ name: '', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'openRedeemRequestCount',
    inputs: [],
    outputs: [{ name: '', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'operator',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'pendingDistributor',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'pendingDistributorFeeUpdate',
    inputs: [],
    outputs: [
      {
        name: '',
        type: 'tuple',
        components: [
          { name: 'recipient', type: 'address' },
          { name: 'rateBps', type: 'uint16' },
          { name: 'executableAt', type: 'uint40' },
          { name: 'pending', type: 'bool' },
        ],
      },
    ],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'pendingRedeem',
    inputs: [{ name: 'requestId', type: 'bytes32' }],
    outputs: [
      {
        name: '',
        type: 'tuple',
        components: [
          { name: 'receiver', type: 'address' },
          { name: 'requester', type: 'address' },
          { name: 'burnedEarnShares', type: 'uint256' },
          { name: 'engineShares', type: 'uint256' },
          { name: 'open', type: 'bool' },
        ],
      },
    ],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'previewRedeem',
    inputs: [{ name: 'earnShares', type: 'uint256' }],
    outputs: [{ name: 'assets', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'previewWithdraw',
    inputs: [{ name: 'assets', type: 'uint256' }],
    outputs: [{ name: 'earnShares', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'rawEngineShares',
    inputs: [],
    outputs: [{ name: '', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'redeem',
    inputs: [
      { name: 'earnShares', type: 'uint256' },
      { name: 'receiver', type: 'address' },
      { name: 'minAssets', type: 'uint256' },
    ],
    outputs: [{ name: 'assets', type: 'uint256' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'remainingDepositCapacity',
    inputs: [],
    outputs: [{ name: 'assets', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'requestRedeem',
    inputs: [
      { name: 'earnShares', type: 'uint256' },
      { name: 'engineData', type: 'bytes' },
      { name: 'receiver', type: 'address' },
    ],
    outputs: [{ name: 'requestId', type: 'bytes32' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'rewardRateBaseline',
    inputs: [],
    outputs: [{ name: '', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'scheduleDistributorFeeUpdate',
    inputs: [
      { name: 'recipient', type: 'address' },
      { name: 'rateBps', type: 'uint16' },
    ],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'setDepositsPaused',
    inputs: [{ name: 'paused', type: 'bool' }],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'setEmergencyRoles',
    inputs: [
      { name: 'newGuardian', type: 'address' },
      { name: 'newJanitor', type: 'address' },
    ],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'setFeeConfig',
    inputs: [
      {
        name: 'config',
        type: 'tuple',
        components: [
          { name: 'fixedFeeCount', type: 'uint8' },
          {
            name: 'fixedFees',
            type: 'tuple[4]',
            components: [
              { name: 'account', type: 'address' },
              { name: 'rateBps', type: 'uint16' },
            ],
          },
          {
            name: 'excess',
            type: 'tuple',
            components: [
              { name: 'enabled', type: 'bool' },
              { name: 'account', type: 'address' },
              { name: 'annualTargetRateBps', type: 'uint16' },
              { name: 'excessFeeRateBps', type: 'uint16' },
            ],
          },
        ],
      },
    ],
    outputs: [{ name: 'configId', type: 'uint64' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'setMaxManagedAssets',
    inputs: [{ name: 'newMaxManagedAssets', type: 'uint256' }],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'surplusEngineShares',
    inputs: [],
    outputs: [{ name: '', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'totalAssets',
    inputs: [],
    outputs: [{ name: 'assets', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'totalEarnShares',
    inputs: [],
    outputs: [{ name: '', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'transferDistributor',
    inputs: [{ name: 'newDistributor', type: 'address' }],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'withdrawExact',
    inputs: [
      { name: 'assets', type: 'uint256' },
      { name: 'receiver', type: 'address' },
      { name: 'maxEarnShares', type: 'uint256' },
    ],
    outputs: [{ name: 'earnSharesBurned', type: 'uint256' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'event',
    name: 'Contributed',
    inputs: [
      { name: 'caller', type: 'address', indexed: true },
      { name: 'assets', type: 'uint256', indexed: false },
      { name: 'engineShares', type: 'uint256', indexed: false },
      { name: 'anchorEngineShares', type: 'uint256', indexed: false },
      { name: 'anchorEarnShares', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'DepositPauseChanged',
    inputs: [
      { name: 'caller', type: 'address', indexed: true },
      { name: 'paused', type: 'bool', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'Deposited',
    inputs: [
      { name: 'caller', type: 'address', indexed: true },
      { name: 'receiver', type: 'address', indexed: true },
      { name: 'assets', type: 'uint256', indexed: false },
      { name: 'earnShares', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'DistributorFeeUpdateCancelled',
    inputs: [{ name: 'distributor', type: 'address', indexed: true }],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'DistributorFeeUpdateScheduled',
    inputs: [
      { name: 'distributor', type: 'address', indexed: true },
      { name: 'recipient', type: 'address', indexed: true },
      { name: 'rateBps', type: 'uint16', indexed: false },
      { name: 'executableAt', type: 'uint40', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'DistributorFeeUpdated',
    inputs: [
      { name: 'recipient', type: 'address', indexed: true },
      { name: 'rateBps', type: 'uint16', indexed: false },
      { name: 'feeConfigId', type: 'uint64', indexed: true },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'DistributorTransferCancelled',
    inputs: [
      { name: 'distributor', type: 'address', indexed: true },
      { name: 'pendingDistributor', type: 'address', indexed: true },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'DistributorTransferStarted',
    inputs: [
      { name: 'distributor', type: 'address', indexed: true },
      { name: 'pendingDistributor', type: 'address', indexed: true },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'DistributorTransferred',
    inputs: [
      { name: 'previousDistributor', type: 'address', indexed: true },
      { name: 'newDistributor', type: 'address', indexed: true },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'EmergencyRolesChanged',
    inputs: [
      { name: 'emergencyGuardian', type: 'address', indexed: true },
      { name: 'asyncJanitor', type: 'address', indexed: true },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'EngineMigrated',
    inputs: [
      { name: 'oldEngine', type: 'address', indexed: true },
      { name: 'newEngine', type: 'address', indexed: true },
      { name: 'oldEngineShares', type: 'uint256', indexed: false },
      { name: 'assetsMoved', type: 'uint256', indexed: false },
      { name: 'newEngineShares', type: 'uint256', indexed: false },
      { name: 'totalEarnShares', type: 'uint256', indexed: false },
      { name: 'anchorEngineShares', type: 'uint256', indexed: false },
      { name: 'anchorEarnShares', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'EngineShareSurplusAbsorbed',
    inputs: [
      { name: 'caller', type: 'address', indexed: true },
      { name: 'engineShares', type: 'uint256', indexed: false },
      { name: 'anchorEngineShares', type: 'uint256', indexed: false },
      { name: 'anchorEarnShares', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'MaxManagedAssetsChanged',
    inputs: [
      { name: 'previousMaxManagedAssets', type: 'uint256', indexed: false },
      { name: 'newMaxManagedAssets', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'RedeemCancelled',
    inputs: [
      { name: 'requestId', type: 'bytes32', indexed: true },
      { name: 'receiver', type: 'address', indexed: true },
      { name: 'earnShares', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'RedeemFinalized',
    inputs: [
      { name: 'requestId', type: 'bytes32', indexed: true },
      { name: 'receiver', type: 'address', indexed: true },
      { name: 'earnShares', type: 'uint256', indexed: false },
      { name: 'asset', type: 'address', indexed: false },
      { name: 'assets', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'RedeemRequested',
    inputs: [
      { name: 'requestId', type: 'bytes32', indexed: true },
      { name: 'requester', type: 'address', indexed: true },
      { name: 'receiver', type: 'address', indexed: true },
      { name: 'earnShares', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'Redeemed',
    inputs: [
      { name: 'caller', type: 'address', indexed: true },
      { name: 'receiver', type: 'address', indexed: true },
      { name: 'earnShares', type: 'uint256', indexed: false },
      { name: 'assets', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'VenueSharesDeposited',
    inputs: [
      { name: 'caller', type: 'address', indexed: true },
      { name: 'receiver', type: 'address', indexed: true },
      { name: 'requestedVenueShares', type: 'uint256', indexed: false },
      { name: 'receivedEngineShares', type: 'uint256', indexed: false },
      { name: 'earnShares', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'WithdrewExact',
    inputs: [
      { name: 'caller', type: 'address', indexed: true },
      { name: 'receiver', type: 'address', indexed: true },
      { name: 'assets', type: 'uint256', indexed: false },
      { name: 'earnSharesBurned', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  { type: 'error', name: 'ActiveSupplyWithoutBacking', inputs: [] },
  { type: 'error', name: 'AlreadyInitialized', inputs: [] },
  { type: 'error', name: 'DepositsPaused', inputs: [] },
  { type: 'error', name: 'DistributorFeeUpdateNotPending', inputs: [] },
  {
    type: 'error',
    name: 'DistributorFeeUpdateNotReady',
    inputs: [{ name: 'executableAt', type: 'uint40' }],
  },
  { type: 'error', name: 'DistributorTransferNotPending', inputs: [] },
  {
    type: 'error',
    name: 'DuplicateRequest',
    inputs: [{ name: 'requestId', type: 'bytes32' }],
  },
  { type: 'error', name: 'EngineAssetMismatch', inputs: [] },
  {
    type: 'error',
    name: 'EngineCapabilityUnsupported',
    inputs: [{ name: 'interfaceId', type: 'bytes4' }],
  },
  { type: 'error', name: 'EngineEarnVaultMismatch', inputs: [] },
  { type: 'error', name: 'EngineExitUnsupported', inputs: [] },
  { type: 'error', name: 'ExceedsMaxEarnShares', inputs: [] },
  {
    type: 'error',
    name: 'ExcessiveConversionLoss',
    inputs: [
      { name: 'inputShares', type: 'uint256' },
      { name: 'representedShares', type: 'uint256' },
    ],
  },
  {
    type: 'error',
    name: 'ExcessiveMigrationClassificationError',
    inputs: [
      { name: 'expectedManagedAssets', type: 'uint256' },
      { name: 'actualManagedAssets', type: 'uint256' },
    ],
  },
  { type: 'error', name: 'FeeValuationStale', inputs: [] },
  {
    type: 'error',
    name: 'FinalizedAssetMismatch',
    inputs: [{ name: 'finalizedAsset', type: 'address' }],
  },
  { type: 'error', name: 'GlobalFeeDisableUnavailable', inputs: [] },
  { type: 'error', name: 'InitialEarnShareSupplyNotZero', inputs: [] },
  {
    type: 'error',
    name: 'InsufficientEngineShareSurplus',
    inputs: [
      { name: 'available', type: 'uint256' },
      { name: 'requested', type: 'uint256' },
    ],
  },
  { type: 'error', name: 'InsufficientOutput', inputs: [] },
  { type: 'error', name: 'InvalidDistributorConfiguration', inputs: [] },
  { type: 'error', name: 'InvalidDistributorFeeConfiguration', inputs: [] },
  { type: 'error', name: 'InvalidEarnDecimals', inputs: [] },
  { type: 'error', name: 'InvalidEngineShareScale', inputs: [] },
  {
    type: 'error',
    name: 'MaxManagedAssetsExceeded',
    inputs: [
      { name: 'maximum', type: 'uint256' },
      { name: 'actual', type: 'uint256' },
    ],
  },
  {
    type: 'error',
    name: 'MinimumAssetsNotMet',
    inputs: [
      { name: 'minimumAssets', type: 'uint256' },
      { name: 'actualAssets', type: 'uint256' },
    ],
  },
  {
    type: 'error',
    name: 'MinimumEarnSharesNotMet',
    inputs: [
      { name: 'minimumEarnShares', type: 'uint256' },
      { name: 'actualEarnShares', type: 'uint256' },
    ],
  },
  {
    type: 'error',
    name: 'MinimumEngineSharesNotMet',
    inputs: [
      { name: 'minimumEngineShares', type: 'uint256' },
      { name: 'actualEngineShares', type: 'uint256' },
    ],
  },
  { type: 'error', name: 'NoEarnShares', inputs: [] },
  { type: 'error', name: 'NotDistributor', inputs: [] },
  { type: 'error', name: 'NotEmergencyGuardianOrOperator', inputs: [] },
  { type: 'error', name: 'NotEngine', inputs: [] },
  { type: 'error', name: 'NotOperator', inputs: [] },
  { type: 'error', name: 'NotPendingDistributor', inputs: [] },
  { type: 'error', name: 'NotRequesterOrJanitor', inputs: [] },
  { type: 'error', name: 'OperatorMigrationDisabled', inputs: [] },
  { type: 'error', name: 'PendingRedeemsOpen', inputs: [] },
  { type: 'error', name: 'ReentrantCall', inputs: [] },
  {
    type: 'error',
    name: 'RequestNotOpen',
    inputs: [{ name: 'requestId', type: 'bytes32' }],
  },
  { type: 'error', name: 'ResidualBacking', inputs: [] },
  {
    type: 'error',
    name: 'RewardRateLimitExceeded',
    inputs: [
      { name: 'normalizedRate', type: 'uint256' },
      { name: 'baselineRate', type: 'uint256' },
    ],
  },
  { type: 'error', name: 'SameEngine', inputs: [] },
  { type: 'error', name: 'TokenCallFailed', inputs: [] },
  { type: 'error', name: 'TokenCallFalse', inputs: [] },
  { type: 'error', name: 'ZeroAddress', inputs: [] },
  { type: 'error', name: 'ZeroAmount', inputs: [] },
  { type: 'error', name: 'ZeroMinimumAssets', inputs: [] },
  { type: 'error', name: 'ZeroMinimumEarnShares', inputs: [] },
  { type: 'error', name: 'ZeroMinimumEngineShares', inputs: [] },
] as const

export const erc4626Engine = [
  {
    type: 'constructor',
    inputs: [
      { name: 'vault_', type: 'address' },
      { name: 'owner_', type: 'address' },
      { name: 'nameOverride_', type: 'string' },
      { name: 'symbolOverride_', type: 'string' },
    ],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'acceptOwnership',
    inputs: [],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'asset',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'baseAsset',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'deposit',
    inputs: [{ name: 'assets', type: 'uint256' }],
    outputs: [{ name: 'engineShares', type: 'uint256' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'depositInKind',
    inputs: [
      { name: 'venueShares', type: 'uint256' },
      { name: 'from', type: 'address' },
    ],
    outputs: [{ name: 'engineSharesReceived', type: 'uint256' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'earnVault',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'initializeEarnVault',
    inputs: [
      { name: 'earnVault_', type: 'address' },
      { name: 'finalOwner_', type: 'address' },
    ],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'initializeEarnVault',
    inputs: [{ name: 'earnVault_', type: 'address' }],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'name',
    inputs: [],
    outputs: [{ name: '', type: 'string' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'owner',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'pendingOwner',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'previewRedeem',
    inputs: [{ name: 'engineShares', type: 'uint256' }],
    outputs: [{ name: 'assets', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'previewWithdraw',
    inputs: [{ name: 'assets', type: 'uint256' }],
    outputs: [{ name: 'engineShares', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'redeem',
    inputs: [
      { name: 'engineShares', type: 'uint256' },
      { name: 'receiver', type: 'address' },
      { name: 'minAssets', type: 'uint256' },
    ],
    outputs: [{ name: 'assets', type: 'uint256' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'renounceOwnership',
    inputs: [],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'shareScale',
    inputs: [],
    outputs: [{ name: '', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'supportsInterface',
    inputs: [{ name: 'interfaceId', type: 'bytes4' }],
    outputs: [{ name: '', type: 'bool' }],
    stateMutability: 'pure',
  },
  {
    type: 'function',
    name: 'symbol',
    inputs: [],
    outputs: [{ name: '', type: 'string' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'totalAssets',
    inputs: [],
    outputs: [{ name: 'assets', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'totalShares',
    inputs: [],
    outputs: [{ name: '', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'transferOwnership',
    inputs: [{ name: 'newOwner', type: 'address' }],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'valueOf',
    inputs: [{ name: 'engineShares', type: 'uint256' }],
    outputs: [{ name: 'assets', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'vault',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'withdraw',
    inputs: [
      { name: 'assets', type: 'uint256' },
      { name: 'receiver', type: 'address' },
    ],
    outputs: [{ name: 'engineShares', type: 'uint256' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'event',
    name: 'Deposited',
    inputs: [
      { name: 'earnVault', type: 'address', indexed: true },
      { name: 'assets', type: 'uint256', indexed: false },
      { name: 'engineShares', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'EarnVaultInitialized',
    inputs: [{ name: 'earnVault', type: 'address', indexed: true }],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'OwnershipTransferStarted',
    inputs: [
      { name: 'previousOwner', type: 'address', indexed: true },
      { name: 'newOwner', type: 'address', indexed: true },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'OwnershipTransferred',
    inputs: [
      { name: 'previousOwner', type: 'address', indexed: true },
      { name: 'newOwner', type: 'address', indexed: true },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'Redeemed',
    inputs: [
      { name: 'receiver', type: 'address', indexed: true },
      { name: 'engineShares', type: 'uint256', indexed: false },
      { name: 'assets', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'VenueSharesDeposited',
    inputs: [
      { name: 'from', type: 'address', indexed: true },
      { name: 'requestedVenueShares', type: 'uint256', indexed: false },
      { name: 'receivedEngineShares', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'WithdrewExact',
    inputs: [
      { name: 'receiver', type: 'address', indexed: true },
      { name: 'assets', type: 'uint256', indexed: false },
      { name: 'engineSharesBurned', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  { type: 'error', name: 'AlreadyInitialized', inputs: [] },
  { type: 'error', name: 'EarnVaultNotSet', inputs: [] },
  { type: 'error', name: 'EmptyMetadata', inputs: [] },
  {
    type: 'error',
    name: 'InsufficientAssetsReceived',
    inputs: [
      { name: 'minimumAssets', type: 'uint256' },
      { name: 'actualAssets', type: 'uint256' },
    ],
  },
  { type: 'error', name: 'InvalidVenueShareDecimals', inputs: [] },
  { type: 'error', name: 'NoVenueSharesReceived', inputs: [] },
  {
    type: 'error',
    name: 'NotEarnVault',
    inputs: [{ name: 'caller', type: 'address' }],
  },
  {
    type: 'error',
    name: 'OwnableInvalidOwner',
    inputs: [{ name: 'owner', type: 'address' }],
  },
  {
    type: 'error',
    name: 'OwnableUnauthorizedAccount',
    inputs: [{ name: 'account', type: 'address' }],
  },
  { type: 'error', name: 'ReentrantCall', inputs: [] },
  { type: 'error', name: 'TransferFailed', inputs: [] },
  {
    type: 'error',
    name: 'UnexpectedAssetsReceived',
    inputs: [
      { name: 'expectedAssets', type: 'uint256' },
      { name: 'actualAssets', type: 'uint256' },
    ],
  },
  {
    type: 'error',
    name: 'UnexpectedVenueSharesBurned',
    inputs: [
      { name: 'expectedShares', type: 'uint256' },
      { name: 'actualShares', type: 'uint256' },
    ],
  },
  { type: 'error', name: 'ZeroAddress', inputs: [] },
] as const

export const erc4626EngineFactory = [
  {
    type: 'function',
    name: 'ENGINE_SALT_DOMAIN',
    inputs: [],
    outputs: [{ name: '', type: 'bytes32' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'computeEngineSalt',
    inputs: [
      { name: 'deploymentId', type: 'bytes32' },
      { name: 'vault', type: 'address' },
      { name: 'owner', type: 'address' },
      { name: 'nameOverride', type: 'string' },
      { name: 'symbolOverride', type: 'string' },
    ],
    outputs: [{ name: '', type: 'bytes32' }],
    stateMutability: 'pure',
  },
  {
    type: 'function',
    name: 'deploy',
    inputs: [
      { name: 'deploymentId', type: 'bytes32' },
      { name: 'vault', type: 'address' },
      { name: 'owner', type: 'address' },
      { name: 'nameOverride', type: 'string' },
      { name: 'symbolOverride', type: 'string' },
    ],
    outputs: [{ name: 'engine', type: 'address' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'predictEngine',
    inputs: [
      { name: 'deploymentId', type: 'bytes32' },
      { name: 'vault', type: 'address' },
      { name: 'owner', type: 'address' },
      { name: 'nameOverride', type: 'string' },
      { name: 'symbolOverride', type: 'string' },
    ],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'event',
    name: 'ERC4626EngineDeployed',
    inputs: [
      { name: 'engine', type: 'address', indexed: true },
      { name: 'vault', type: 'address', indexed: true },
      { name: 'owner', type: 'address', indexed: true },
      { name: 'asset', type: 'address', indexed: false },
      { name: 'deploymentId', type: 'bytes32', indexed: false },
      { name: 'engineSalt', type: 'bytes32', indexed: false },
    ],
    anonymous: false,
  },
  { type: 'error', name: 'EmptyDeploymentId', inputs: [] },
  {
    type: 'error',
    name: 'EngineAlreadyExists',
    inputs: [{ name: 'engine', type: 'address' }],
  },
  { type: 'error', name: 'FactoryCannotBeFinalOwner', inputs: [] },
] as const

export const vedaEngine = [
  {
    type: 'constructor',
    inputs: [
      { name: 'peripheryRegistry_', type: 'address' },
      { name: 'owner_', type: 'address' },
      { name: 'maxRateAge_', type: 'uint64' },
      { name: 'name_', type: 'string' },
      { name: 'symbol_', type: 'string' },
    ],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'acceptOwnership',
    inputs: [],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'accountant',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'accountantRateUpdatedAt',
    inputs: [],
    outputs: [{ name: '', type: 'uint64' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'asset',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'authorizedForwarder',
    inputs: [{ name: 'forwarder', type: 'address' }],
    outputs: [{ name: 'authorized', type: 'bool' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'baseAsset',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'cancelRedeem',
    inputs: [{ name: 'requestId', type: 'bytes32' }],
    outputs: [{ name: 'engineShares', type: 'uint256' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'claimQueue',
    inputs: [{ name: 'requestId', type: 'bytes32' }],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'claimRedeem',
    inputs: [{ name: 'requestId', type: 'bytes32' }],
    outputs: [{ name: 'amount', type: 'uint256' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'deposit',
    inputs: [{ name: 'assets', type: 'uint256' }],
    outputs: [{ name: 'engineShares', type: 'uint256' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'earnVault',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'finalizeOneExternal',
    inputs: [{ name: 'requestId', type: 'bytes32' }],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'forwardSolved',
    inputs: [
      { name: 'requestIds', type: 'bytes32[]' },
      { name: 'asset_', type: 'address' },
      { name: 'delta', type: 'uint256' },
    ],
    outputs: [{ name: 'claimed', type: 'uint256' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'getClaim',
    inputs: [{ name: 'requestId', type: 'bytes32' }],
    outputs: [
      { name: 'status', type: 'uint8' },
      {
        name: 'request',
        type: 'tuple',
        components: [
          { name: 'nonce', type: 'uint96' },
          { name: 'user', type: 'address' },
          { name: 'assetOut', type: 'address' },
          { name: 'amountOfShares', type: 'uint128' },
          { name: 'amountOfAssets', type: 'uint128' },
          { name: 'creationTime', type: 'uint40' },
          { name: 'secondsToMaturity', type: 'uint24' },
          { name: 'secondsToDeadline', type: 'uint24' },
        ],
      },
    ],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'initializeEarnVault',
    inputs: [
      { name: 'earnVault_', type: 'address' },
      { name: 'finalOwner_', type: 'address' },
    ],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'initializeEarnVault',
    inputs: [{ name: 'earnVault_', type: 'address' }],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'isFeeValuationFresh',
    inputs: [],
    outputs: [{ name: '', type: 'bool' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'maxRateAge',
    inputs: [],
    outputs: [{ name: '', type: 'uint64' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'name',
    inputs: [],
    outputs: [{ name: '', type: 'string' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'openClaimsByQueue',
    inputs: [{ name: 'requestQueue', type: 'address' }],
    outputs: [{ name: 'count', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'owner',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'pendingOwner',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'peripheryRegistry',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'peripheryVersion',
    inputs: [],
    outputs: [{ name: '', type: 'uint64' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'previewRedeem',
    inputs: [{ name: 'engineShares', type: 'uint256' }],
    outputs: [{ name: 'assets', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'previewWithdraw',
    inputs: [{ name: 'assets', type: 'uint256' }],
    outputs: [{ name: 'engineShares', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'queue',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'rate',
    inputs: [],
    outputs: [{ name: '', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'recoverExternalSettlement',
    inputs: [{ name: 'requestIds', type: 'bytes32[]' }],
    outputs: [{ name: 'claimed', type: 'uint256' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'redeem',
    inputs: [
      { name: 'engineShares', type: 'uint256' },
      { name: 'receiver', type: 'address' },
      { name: 'minAssets', type: 'uint256' },
    ],
    outputs: [{ name: 'assets', type: 'uint256' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'renounceOwnership',
    inputs: [],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'requestRedeem',
    inputs: [
      { name: 'engineShares', type: 'uint256' },
      { name: 'requestData', type: 'bytes' },
    ],
    outputs: [{ name: 'requestId', type: 'bytes32' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'setAuthorizedForwarder',
    inputs: [
      { name: 'account', type: 'address' },
      { name: 'authorized', type: 'bool' },
    ],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'setMaxRateAge',
    inputs: [{ name: 'newMaxRateAge', type: 'uint64' }],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'settled',
    inputs: [{ name: 'asset', type: 'address' }],
    outputs: [{ name: 'amount', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'shareScale',
    inputs: [],
    outputs: [{ name: '', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'supportsInterface',
    inputs: [{ name: 'interfaceId', type: 'bytes4' }],
    outputs: [{ name: '', type: 'bool' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'sweepDust',
    inputs: [
      { name: 'token', type: 'address' },
      { name: 'to', type: 'address' },
      { name: 'amount', type: 'uint256' },
    ],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'symbol',
    inputs: [],
    outputs: [{ name: '', type: 'string' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'syncVedaPeriphery',
    inputs: [
      { name: 'minRate', type: 'uint256' },
      { name: 'maxRate', type: 'uint256' },
    ],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'teller',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'totalAssets',
    inputs: [],
    outputs: [{ name: 'assets', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'totalShares',
    inputs: [],
    outputs: [{ name: '', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'transferOwnership',
    inputs: [{ name: 'newOwner', type: 'address' }],
    outputs: [],
    stateMutability: 'nonpayable',
  },
  {
    type: 'function',
    name: 'unresolvedClaimCount',
    inputs: [],
    outputs: [{ name: '', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'valueOf',
    inputs: [{ name: 'engineShares', type: 'uint256' }],
    outputs: [{ name: 'assets', type: 'uint256' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'vault',
    inputs: [],
    outputs: [{ name: '', type: 'address' }],
    stateMutability: 'view',
  },
  {
    type: 'function',
    name: 'withdraw',
    inputs: [
      { name: 'assets', type: 'uint256' },
      { name: 'receiver', type: 'address' },
    ],
    outputs: [{ name: 'engineShares', type: 'uint256' }],
    stateMutability: 'nonpayable',
  },
  {
    type: 'event',
    name: 'AuthorizedForwarderChanged',
    inputs: [
      { name: 'account', type: 'address', indexed: true },
      { name: 'authorized', type: 'bool', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'Deposited',
    inputs: [
      { name: 'earnVault', type: 'address', indexed: true },
      { name: 'assets', type: 'uint256', indexed: false },
      { name: 'engineShares', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'DustSwept',
    inputs: [
      { name: 'token', type: 'address', indexed: true },
      { name: 'to', type: 'address', indexed: true },
      { name: 'amount', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'EarnVaultInitialized',
    inputs: [{ name: 'earnVault', type: 'address', indexed: true }],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'ExternalSettlementRecovered',
    inputs: [
      { name: 'requestCount', type: 'uint256', indexed: false },
      { name: 'recoveredAssets', type: 'uint256', indexed: false },
      { name: 'claimed', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'FinalizeFailed',
    inputs: [
      { name: 'requestId', type: 'bytes32', indexed: true },
      { name: 'asset', type: 'address', indexed: true },
      { name: 'amount', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'Finalized',
    inputs: [
      { name: 'requestId', type: 'bytes32', indexed: true },
      { name: 'asset', type: 'address', indexed: true },
      { name: 'amount', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'MaxRateAgeUpdated',
    inputs: [
      { name: 'oldMaxRateAge', type: 'uint64', indexed: false },
      { name: 'newMaxRateAge', type: 'uint64', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'OwnershipTransferStarted',
    inputs: [
      { name: 'previousOwner', type: 'address', indexed: true },
      { name: 'newOwner', type: 'address', indexed: true },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'OwnershipTransferred',
    inputs: [
      { name: 'previousOwner', type: 'address', indexed: true },
      { name: 'newOwner', type: 'address', indexed: true },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'RedeemCancelledOnQueue',
    inputs: [
      { name: 'requestId', type: 'bytes32', indexed: true },
      { name: 'engineShares', type: 'uint128', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'RedeemClaimed',
    inputs: [
      { name: 'requestId', type: 'bytes32', indexed: true },
      { name: 'asset', type: 'address', indexed: true },
      { name: 'amount', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'RedeemRequested',
    inputs: [
      { name: 'requestId', type: 'bytes32', indexed: true },
      { name: 'assetOut', type: 'address', indexed: true },
      { name: 'engineShares', type: 'uint128', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'Redeemed',
    inputs: [
      { name: 'receiver', type: 'address', indexed: true },
      { name: 'engineShares', type: 'uint256', indexed: false },
      { name: 'assets', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'Settled',
    inputs: [
      { name: 'asset', type: 'address', indexed: true },
      { name: 'amount', type: 'uint256', indexed: false },
      { name: 'newTotal', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'Unearmarked',
    inputs: [
      { name: 'asset', type: 'address', indexed: true },
      { name: 'amount', type: 'uint256', indexed: false },
      { name: 'newTotal', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'VedaPeripheryUpdated',
    inputs: [
      { name: 'registryVersion', type: 'uint64', indexed: true },
      { name: 'oldTeller', type: 'address', indexed: true },
      { name: 'oldQueue', type: 'address', indexed: true },
      { name: 'oldAccountant', type: 'address', indexed: false },
      { name: 'newTeller', type: 'address', indexed: false },
      { name: 'newQueue', type: 'address', indexed: false },
      { name: 'newAccountant', type: 'address', indexed: false },
      { name: 'validatedRate', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  {
    type: 'event',
    name: 'WithdrewExact',
    inputs: [
      { name: 'receiver', type: 'address', indexed: true },
      { name: 'assets', type: 'uint256', indexed: false },
      { name: 'engineSharesBurned', type: 'uint256', indexed: false },
    ],
    anonymous: false,
  },
  { type: 'error', name: 'AlreadyInitialized', inputs: [] },
  {
    type: 'error',
    name: 'AssetsNotArrived',
    inputs: [{ name: 'requestId', type: 'bytes32' }],
  },
  {
    type: 'error',
    name: 'BaseAssetSweepBlocked',
    inputs: [{ name: 'unresolvedClaims', type: 'uint256' }],
  },
  { type: 'error', name: 'CannotSweepEngineBacking', inputs: [] },
  {
    type: 'error',
    name: 'ClaimNotClaimable',
    inputs: [{ name: 'requestId', type: 'bytes32' }],
  },
  {
    type: 'error',
    name: 'ClaimNotOpen',
    inputs: [{ name: 'requestId', type: 'bytes32' }],
  },
  {
    type: 'error',
    name: 'CreditExceedsBalance',
    inputs: [
      { name: 'asset', type: 'address' },
      { name: 'have', type: 'uint256' },
      { name: 'wantTotal', type: 'uint256' },
    ],
  },
  { type: 'error', name: 'DepositsNotPaused', inputs: [] },
  {
    type: 'error',
    name: 'DuplicateRequest',
    inputs: [{ name: 'requestId', type: 'bytes32' }],
  },
  { type: 'error', name: 'EarnVaultNotSet', inputs: [] },
  { type: 'error', name: 'EmptyMetadata', inputs: [] },
  {
    type: 'error',
    name: 'EngineSharesTooLarge',
    inputs: [{ name: 'engineShares', type: 'uint256' }],
  },
  {
    type: 'error',
    name: 'InsufficientAssetsReceived',
    inputs: [
      { name: 'minimumAssets', type: 'uint256' },
      { name: 'actualAssets', type: 'uint256' },
    ],
  },
  {
    type: 'error',
    name: 'InvalidAsset',
    inputs: [
      { name: 'expected', type: 'address' },
      { name: 'actual', type: 'address' },
    ],
  },
  { type: 'error', name: 'InvalidMaxRateAge', inputs: [] },
  {
    type: 'error',
    name: 'InvalidRateTimestamp',
    inputs: [
      { name: 'updatedAt', type: 'uint256' },
      { name: 'currentTime', type: 'uint256' },
    ],
  },
  {
    type: 'error',
    name: 'InvalidTrackedRequest',
    inputs: [{ name: 'requestId', type: 'bytes32' }],
  },
  {
    type: 'error',
    name: 'InvalidVedaPeriphery',
    inputs: [{ name: 'account', type: 'address' }],
  },
  {
    type: 'error',
    name: 'InvalidVedaPeripheryWiring',
    inputs: [
      { name: 'component', type: 'address' },
      { name: 'expected', type: 'address' },
      { name: 'actual', type: 'address' },
    ],
  },
  {
    type: 'error',
    name: 'InvalidVedaRateBounds',
    inputs: [
      { name: 'minRate', type: 'uint256' },
      { name: 'maxRate', type: 'uint256' },
    ],
  },
  { type: 'error', name: 'InvalidVenueShareDecimals', inputs: [] },
  { type: 'error', name: 'NoPublishedVedaPeriphery', inputs: [] },
  { type: 'error', name: 'NoRecoverableClaims', inputs: [] },
  { type: 'error', name: 'NoVenueSharesReceived', inputs: [] },
  {
    type: 'error',
    name: 'NotAuthorizedForwarder',
    inputs: [{ name: 'caller', type: 'address' }],
  },
  {
    type: 'error',
    name: 'NotEarnVault',
    inputs: [{ name: 'caller', type: 'address' }],
  },
  { type: 'error', name: 'NotSelf', inputs: [] },
  {
    type: 'error',
    name: 'OwnableInvalidOwner',
    inputs: [{ name: 'owner', type: 'address' }],
  },
  {
    type: 'error',
    name: 'OwnableUnauthorizedAccount',
    inputs: [{ name: 'account', type: 'address' }],
  },
  {
    type: 'error',
    name: 'QueueTrackingDisabled',
    inputs: [{ name: 'queue', type: 'address' }],
  },
  { type: 'error', name: 'QueueUnavailable', inputs: [] },
  {
    type: 'error',
    name: 'RateChangedWithinTransaction',
    inputs: [
      { name: 'expected', type: 'uint256' },
      { name: 'actual', type: 'uint256' },
    ],
  },
  { type: 'error', name: 'ReentrantCall', inputs: [] },
  {
    type: 'error',
    name: 'RegistryEngineMismatch',
    inputs: [
      { name: 'expected', type: 'address' },
      { name: 'actual', type: 'address' },
    ],
  },
  {
    type: 'error',
    name: 'SolveUnderfunded',
    inputs: [
      { name: 'asset', type: 'address' },
      { name: 'delivered', type: 'uint256' },
      { name: 'required', type: 'uint256' },
    ],
  },
  {
    type: 'error',
    name: 'StaleAccountantRate',
    inputs: [
      { name: 'updatedAt', type: 'uint256' },
      { name: 'currentTime', type: 'uint256' },
      { name: 'maxAge', type: 'uint256' },
    ],
  },
  {
    type: 'error',
    name: 'SweepExceedsAvailableBalance',
    inputs: [
      { name: 'token', type: 'address' },
      { name: 'available', type: 'uint256' },
      { name: 'requested', type: 'uint256' },
    ],
  },
  { type: 'error', name: 'TransferFailed', inputs: [] },
  {
    type: 'error',
    name: 'UnexpectedAssetsReceived',
    inputs: [
      { name: 'expectedAssets', type: 'uint256' },
      { name: 'actualAssets', type: 'uint256' },
    ],
  },
  {
    type: 'error',
    name: 'UnexpectedVenueSharesBurned',
    inputs: [
      { name: 'expectedShares', type: 'uint256' },
      { name: 'actualShares', type: 'uint256' },
    ],
  },
  {
    type: 'error',
    name: 'UnexpectedVenueSharesQueued',
    inputs: [
      { name: 'expectedShares', type: 'uint256' },
      { name: 'actualShares', type: 'uint256' },
    ],
  },
  {
    type: 'error',
    name: 'UnsupportedAccountantFreshness',
    inputs: [{ name: 'accountant', type: 'address' }],
  },
  {
    type: 'error',
    name: 'VedaRateOutOfBounds',
    inputs: [
      { name: 'rate', type: 'uint256' },
      { name: 'minRate', type: 'uint256' },
      { name: 'maxRate', type: 'uint256' },
    ],
  },
  { type: 'error', name: 'ZeroAddress', inputs: [] },
] as const

// `SingleZoneEarnRouter.CallbackData` parameter for `encodeAbiParameters`.
export const earnRouterCallbackData = [
  {
    components: [
      { name: 'flow', type: 'uint8' },
      { name: 'minVaultAssets', type: 'uint128' },
      { name: 'minEarnShares', type: 'uint128' },
      { name: 'minOutputAmount', type: 'uint128' },
      { name: 'actionId', type: 'bytes32' },
      {
        components: [
          { name: 'keyIndex', type: 'uint256' },
          {
            components: [
              { name: 'ephemeralPubkeyX', type: 'bytes32' },
              { name: 'ephemeralPubkeyYParity', type: 'uint8' },
              { name: 'ciphertext', type: 'bytes' },
              { name: 'nonce', type: 'bytes12' },
              { name: 'tag', type: 'bytes16' },
            ],
            name: 'encrypted',
            type: 'tuple',
          },
          { name: 'refundRecipient', type: 'address' },
        ],
        name: 'zoneReturn',
        type: 'tuple',
      },
    ],
    name: 'callbackData',
    type: 'tuple',
  },
] as const

// Source: tempoxyz/zones@7e38642cdd5a1500784fd15cf30eda5366f3350a

export const zoneOutbox = [
  {
    name: 'tempoGasRate',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint128' }],
  },
  {
    name: 'maxWithdrawalsPerBlock',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint32' }],
  },
  {
    name: 'lastBatch',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [
      {
        type: 'tuple',
        components: [
          { type: 'bytes32', name: 'withdrawalQueueHash' },
          { type: 'uint64', name: 'withdrawalBatchIndex' },
        ],
      },
    ],
  },
  {
    name: 'lastFinalizedTimestamp',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'nextWithdrawalIndex',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'lastFallbackNonce',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'pendingWithdrawalsCount',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint256' }],
  },
  {
    name: 'getPendingWithdrawals',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [
      {
        type: 'tuple[]',
        components: [
          { type: 'address', name: 'token' },
          { type: 'address', name: 'sender' },
          { type: 'bytes32', name: 'txHash' },
          { type: 'address', name: 'to' },
          { type: 'uint128', name: 'amount' },
          { type: 'bytes32', name: 'memo' },
          { type: 'uint64', name: 'gasLimit' },
          { type: 'uint64', name: 'fallbackNonce' },
          { type: 'bytes', name: 'callbackData' },
          { type: 'bytes', name: 'revealTo' },
        ],
      },
    ],
  },
  {
    name: 'consumeFallbackRecipient',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'uint64', name: 'fallbackNonce' }],
    outputs: [{ type: 'address', name: 'recipient' }],
  },
  {
    name: 'calculateWithdrawalFee',
    type: 'function',
    stateMutability: 'view',
    inputs: [{ type: 'uint64', name: 'gasLimit' }],
    outputs: [{ type: 'uint128', name: 'fee' }],
  },
  {
    name: 'MAX_CALLBACK_DATA_SIZE',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint256' }],
  },
  {
    name: 'MAX_WITHDRAWAL_GAS_LIMIT',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'WITHDRAWAL_BASE_GAS',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint64' }],
  },
  {
    name: 'REVEAL_TO_KEY_LENGTH',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint256' }],
  },
  {
    name: 'AUTHENTICATED_WITHDRAWAL_CIPHERTEXT_LENGTH',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ type: 'uint256' }],
  },
  {
    name: 'setTempoGasRate',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'uint128', name: '_tempoGasRate' }],
    outputs: [],
  },
  {
    name: 'setMaxWithdrawalsPerBlock',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [{ type: 'uint32', name: '_maxWithdrawalsPerBlock' }],
    outputs: [],
  },
  {
    name: 'requestWithdrawal',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'token' },
      { type: 'address', name: 'to' },
      { type: 'uint128', name: 'amount' },
      { type: 'bytes32', name: 'memo' },
      { type: 'uint64', name: 'gasLimit' },
      { type: 'address', name: 'zoneFallbackRecipient' },
      { type: 'bytes', name: 'data' },
      { type: 'bytes', name: 'revealTo' },
    ],
    outputs: [],
  },
  {
    name: 'enqueueDepositBounceBack',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'address', name: 'token' },
      { type: 'uint128', name: 'amount' },
      { type: 'address', name: 'tempoRefundRecipient' },
    ],
    outputs: [],
  },
  {
    name: 'finalizeWithdrawalBatch',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'uint256', name: 'count' },
      { type: 'uint64', name: 'blockNumber' },
      { type: 'bytes[]', name: 'encryptedSenders' },
    ],
    outputs: [{ type: 'bytes32', name: 'withdrawalQueueHash' }],
  },
  {
    name: 'WithdrawalRequested',
    type: 'event',
    inputs: [
      { type: 'uint64', name: 'withdrawalIndex', indexed: true },
      { type: 'address', name: 'sender', indexed: true },
      { type: 'address', name: 'token' },
      { type: 'address', name: 'to' },
      { type: 'uint128', name: 'amount' },
      { type: 'uint128', name: 'fee' },
      { type: 'bytes32', name: 'memo' },
      { type: 'uint64', name: 'gasLimit' },
      { type: 'uint64', name: 'fallbackNonce' },
      { type: 'bytes', name: 'data' },
      { type: 'bytes', name: 'revealTo' },
    ],
  },
  {
    name: 'BatchFinalized',
    type: 'event',
    inputs: [
      { type: 'bytes32', name: 'withdrawalQueueHash', indexed: true },
      { type: 'uint64', name: 'withdrawalBatchIndex' },
    ],
  },
  {
    name: 'TempoGasRateUpdated',
    type: 'event',
    inputs: [{ type: 'uint128', name: 'tempoGasRate' }],
  },
  {
    name: 'MaxWithdrawalsPerBlockUpdated',
    type: 'event',
    inputs: [{ type: 'uint32', name: 'maxWithdrawalsPerBlock' }],
  },
  { name: 'OnlySequencer', type: 'error', inputs: [] },
  { name: 'GasLimitTooHigh', type: 'error', inputs: [] },
  { name: 'OnlyZoneInbox', type: 'error', inputs: [] },
  {
    name: 'InvalidWithdrawalCount',
    type: 'error',
    inputs: [
      { type: 'uint256', name: 'actual' },
      { type: 'uint256', name: 'expected' },
    ],
  },
  {
    name: 'InvalidEncryptedSenderCount',
    type: 'error',
    inputs: [
      { type: 'uint256', name: 'actual' },
      { type: 'uint256', name: 'expected' },
    ],
  },
  {
    name: 'InvalidEncryptedSenderLength',
    type: 'error',
    inputs: [
      { type: 'uint256', name: 'actual' },
      { type: 'uint256', name: 'expected' },
    ],
  },
  { name: 'InvalidFallbackRecipient', type: 'error', inputs: [] },
  { name: 'CallbackDataTooLarge', type: 'error', inputs: [] },
  { name: 'GasFeeRateTooHigh', type: 'error', inputs: [] },
  { name: 'TransferFailed', type: 'error', inputs: [] },
  { name: 'InvalidBlockNumber', type: 'error', inputs: [] },
  { name: 'TooManyWithdrawalsThisBlock', type: 'error', inputs: [] },
  { name: 'InvalidRevealTo', type: 'error', inputs: [] },
  { name: 'InvalidCurrentTxHash', type: 'error', inputs: [] },
  { name: 'ZeroAmountWithdrawal', type: 'error', inputs: [] },
  { name: 'StaticCallNotAllowed', type: 'error', inputs: [] },
] as const

export const zoneMessenger = [
  {
    name: 'relayMessage',
    type: 'function',
    stateMutability: 'nonpayable',
    inputs: [
      { type: 'uint32', name: 'zoneId' },
      { type: 'address', name: 'token' },
      { type: 'bytes32', name: 'senderTag' },
      { type: 'address', name: 'target' },
      { type: 'uint128', name: 'amount' },
      { type: 'uint64', name: 'gasLimit' },
      { type: 'bytes', name: 'data' },
    ],
    outputs: [],
  },
] as const

export const zoneVerifier = [
  {
    name: 'verify',
    type: 'function',
    stateMutability: 'view',
    inputs: [
      { type: 'uint32', name: 'zoneId' },
      { type: 'uint64', name: 'tempoBlockNumber' },
      { type: 'uint64', name: 'anchorBlockNumber' },
      { type: 'bytes32', name: 'anchorBlockHash' },
      { type: 'uint64', name: 'expectedWithdrawalBatchIndex' },
      {
        type: 'tuple',
        name: 'blockTransition',
        components: [
          { type: 'bytes32', name: 'prevBlockHash' },
          { type: 'bytes32', name: 'nextBlockHash' },
        ],
      },
      {
        type: 'tuple',
        name: 'depositQueueTransition',
        components: [
          { type: 'bytes32', name: 'prevProcessedHash' },
          { type: 'bytes32', name: 'nextProcessedHash' },
          { type: 'uint64', name: 'prevDepositNumber' },
          { type: 'uint64', name: 'nextDepositNumber' },
        ],
      },
      { type: 'bytes32', name: 'withdrawalQueueHash' },
      { type: 'bytes', name: 'verifierConfig' },
      { type: 'bytes', name: 'proof' },
    ],
    outputs: [{ type: 'bool' }],
  },
] as const

export const core = [
  ...accountKeychain,
  ...addressRegistry,
  ...currentCommittee,
  ...feeAmm,
  ...feeManager,
  ...nativeMultisig,
  ...nonce,
  ...receivePolicyGuard,
  ...signatureVerifier,
  ...stablecoinDex,
  ...storageCredits,
  ...tip20,
  ...tip20ChannelReserve,
  ...tip20Factory,
  ...tip403Registry,
  ...validatorConfig,
  ...validatorConfigV2,
  ...zoneFactory,
  ...zonePortal,
] as const

export const earn = [
  ...earnContributionController,
  ...earnEngine,
  ...earnEngineAsyncRedeem,
  ...earnEngineInKindDeposit,
  ...earnFactory,
  ...earnFees,
  ...earnMerkleRewardDistributor,
  ...earnRouter,
  ...earnVault,
  ...erc4626Engine,
  ...erc4626EngineFactory,
  ...vedaEngine,
] as const

export const zone = [...zoneMessenger, ...zoneOutbox, ...zoneVerifier] as const

export const all = [...core, ...earn, ...zone] as const