Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .changeset/remove-ibc-oracle-precompiles.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
'@sei-js/precompiles': major
---

**Breaking:** remove the IBC and Oracle precompiles. `IBC_PRECOMPILE_ADDRESS`, `IBC_PRECOMPILE_ABI`, `ETHERS_IBC_PRECOMPILE_ABI`, `getIbcPrecompileEthersV6Contract`, `VIEM_IBC_PRECOMPILE_ABI`, `ORACLE_PRECOMPILE_ADDRESS`, `ORACLE_PRECOMPILE_ABI`, `ETHERS_ORACLE_PRECOMPILE_ABI`, `getOraclePrecompileEthersV6Contract`, and `VIEM_ORACLE_PRECOMPILE_ABI` are no longer exported.
**Breaking:** remove the unsupported IBC and Oracle precompile addresses, ABIs, and Ethers factories.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[suggestion] Rewriting this line dropped the explicit list of removed export names. The previous text named every symbol (IBC_PRECOMPILE_ADDRESS, ETHERS_IBC_PRECOMPILE_ABI, VIEM_ORACLE_PRECOMPILE_ABI, …), which is exactly what a consumer greps for when their build breaks after a major bump.

The new prose ("addresses, ABIs, and Ethers factories") plus the Viem paragraph describes the shape of the change but leaves the reader to reconstruct the ten VIEM_*_PRECOMPILE_ABI names and the IBC/Oracle symbols themselves. Since this is the release note for a breaking change, suggest keeping the summary sentence and restoring the enumeration below it.


Neither precompile is supported on Sei any more, so calls to them fail on-chain regardless of where the address and ABI come from. There is no drop-in replacement: re-declaring them locally will not restore working calls, and code still depending on them needs to move off these precompiles.

Also remove the redundant Viem-specific ABI aliases. Import the raw `*_PRECOMPILE_ABI` constants instead; they work directly with Viem and preserve literal types for contract inference. The `viem` subpath re-exports these raw constants alongside the Sei chain definitions.
7 changes: 7 additions & 0 deletions .changeset/sync-v66-precompiles.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@sei-js/precompiles': minor
---

Sync the exported precompile ABIs with Sei Chain v6.6.1.

This adds the P256 precompile address, ABI, and Ethers factory. It also adds the missing staking queries and events, governance proposal methods, distribution events and validator commission withdrawal, JSON array extraction, and CW1155 pointer methods.
1 change: 1 addition & 0 deletions biome.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
"!**/bun.lock",
"!packages/create-sei/templates",
"!packages/create-sei/extensions",
"!packages/precompiles/src/__tests__/fixtures/v66",
"!packages/registry/chain-registry",
"!packages/registry/community-assetlist"
]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,9 @@
import { CodeHighlight } from '@mantine/code-highlight';
import { ActionIcon, Badge, Button, Card, Collapse, Container, Flex, Group, Paper, Stack, Text, ThemeIcon, Title } from '@mantine/core';
import { notifications } from '@mantine/notifications';
import { BANK_PRECOMPILE_ADDRESS, VIEM_BANK_PRECOMPILE_ABI } from '@sei-js/precompiles';
import { BANK_PRECOMPILE_ABI, BANK_PRECOMPILE_ADDRESS } from '@sei-js/precompiles';
import { IconBulb, IconChevronDown, IconChevronUp, IconCopy, IconDatabase } from '@tabler/icons-react';
import { useState } from 'react';
import type { ReadContractParameters } from 'viem';
import { usePublicClient } from 'wagmi';

function Examples() {
Expand Down Expand Up @@ -49,16 +48,14 @@ function Examples() {
return undefined;
}

const readContractParams: ReadContractParameters = {
abi: VIEM_BANK_PRECOMPILE_ABI,
address: BANK_PRECOMPILE_ADDRESS,
functionName: 'supply',
args: ['usei']
};

try {
const result = await publicClient.readContract(readContractParams);
setSupply((result as bigint).toString());
const result = await publicClient.readContract({
abi: BANK_PRECOMPILE_ABI,
address: BANK_PRECOMPILE_ADDRESS,
functionName: 'supply',
args: ['usei']
});
setSupply(result.toString());
} catch (error) {
console.error('Error fetching supply:', error);
notifications.show({
Expand All @@ -70,21 +67,19 @@ function Examples() {
};

const codeExample = `// Sei Precompile Example - Bank Precompile
import { BANK_PRECOMPILE_ADDRESS, VIEM_BANK_PRECOMPILE_ABI } from '@sei-js/precompiles';
import { BANK_PRECOMPILE_ABI, BANK_PRECOMPILE_ADDRESS } from '@sei-js/precompiles';
import { usePublicClient } from 'wagmi';

const publicClient = usePublicClient();

const getSeiSupply = async () => {
const readContractParams = {
abi: VIEM_BANK_PRECOMPILE_ABI,
const result = await publicClient?.readContract({
abi: BANK_PRECOMPILE_ABI,
address: BANK_PRECOMPILE_ADDRESS,
functionName: 'supply',
args: ['usei'],
};

const result = await publicClient?.readContract(readContractParams);
return (result as bigint).toString();
});
return result?.toString();
};`;

return (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,22 +26,19 @@ const weiBalance = await publicClient.getBalance({ address });
const seiBalance = formatEther(weiBalance);`;

export const precompileCodeExample = `// Import Sei precompiles
import { VIEM_BANK_PRECOMPILE_ABI, BANK_PRECOMPILE_ADDRESS } from '@sei-js/precompiles';
import { BANK_PRECOMPILE_ABI, BANK_PRECOMPILE_ADDRESS } from '@sei-js/precompiles';
import { usePublicClient } from 'wagmi';
import { type ReadContractParameters } from 'viem';

// Use the hook
const publicClient = usePublicClient();

// Call precompile
const readContractParams: ReadContractParameters = {
abi: VIEM_BANK_PRECOMPILE_ABI,
const result = await publicClient.readContract({
abi: BANK_PRECOMPILE_ABI,
address: BANK_PRECOMPILE_ADDRESS,
functionName: 'supply',
args: ['usei']
};

const result = await publicClient.readContract(readContractParams);`;
});`;

export const transactionCodeExample = `// Import transaction hooks
import { useSendTransaction, useWaitForTransactionReceipt } from 'wagmi';
Expand Down
50 changes: 43 additions & 7 deletions packages/precompiles/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,23 +7,59 @@
[![TypeScript](https://img.shields.io/badge/TypeScript-007ACC?logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
[![Sei Network](https://img.shields.io/badge/Sei-Network-red)](https://sei.io)

**TypeScript utilities for interacting with Sei's precompile contracts**
TypeScript ABIs, addresses, and Ethers/Viem helpers for Sei precompiles.

[GitHub](https://github.com/sei-protocol/sei-js) • [NPM](https://www.npmjs.com/package/@sei-js/precompiles) • [Telegram](https://t.me/+LPW_1djQwRQwMzlk)

</div>

## 🚀 Quick Start
## Install

```bash
npm install @sei-js/precompiles
```

Works seamlessly with your favorite Ethereum development tools:
- **Viem** - Type-safe contract interactions
- **Ethers.js** - Contract factories and utilities
- **Wagmi** - React hooks for precompile contracts
- **Hardhat/Foundry** - Testing and deployment
## Sei Chain compatibility

The exported ABIs match [Sei Chain v6.6.1](https://github.com/sei-protocol/sei-chain/tree/v6.6.1/precompiles). The `legacy/v66` directory is a frozen historical snapshot for that release, not a moving view of the current chain surface. Chain and package versions are independent; adopting a later Sei Chain minor snapshot is treated as at least a minor release of `@sei-js/precompiles`.

This package exports:

- Bank at `0x0000000000000000000000000000000000001001`
- CosmWasm at `0x0000000000000000000000000000000000001002`
- JSON at `0x0000000000000000000000000000000000001003`
- Address association at `0x0000000000000000000000000000000000001004`
- Staking at `0x0000000000000000000000000000000000001005`
- Governance at `0x0000000000000000000000000000000000001006`
- Distribution at `0x0000000000000000000000000000000000001007`
- Pointer view at `0x000000000000000000000000000000000000100A`
- Pointer registration at `0x000000000000000000000000000000000000100B`
- Solo migration at `0x000000000000000000000000000000000000100C`
- P256 verification at `0x0000000000000000000000000000000000001011`

Oracle and IBC are intentionally excluded: the [v6.6.1 Oracle implementation returns a retired error for every query](https://github.com/sei-protocol/sei-chain/blob/v6.6.1/precompiles/oracle/oracle.go#L85-L104), and [SIP-03 disabled IBC in both directions](https://docs.sei.io/learn/sip-03-migration#ibc-is-disabled). Calls to either cannot succeed on live Sei. Some ABI methods can also be disabled by chain governance. Check the [Sei precompile docs](https://docs.sei.io/evm/precompiles/example-usage) before using a deprecated module or method.

## Usage

Addresses and raw `as const` ABIs are available from the package root and the `precompiles` and `viem` entrypoints. They work directly with Viem and preserve full type inference. Ethers factories are available from the `ethers` entrypoint.

```ts
import { STAKING_PRECOMPILE_ABI, STAKING_PRECOMPILE_ADDRESS } from '@sei-js/precompiles';
import { getStakingPrecompileEthersV6Contract } from '@sei-js/precompiles/ethers';
```

With a configured Viem public client, the v6.6 staking query methods can be called directly:

```ts
const result = await publicClient.readContract({
address: STAKING_PRECOMPILE_ADDRESS,
abi: STAKING_PRECOMPILE_ABI,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nit] Minor inconsistency between the two snippets: the import block above advertises VIEM_STAKING_PRECOMPILE_ABI from the viem entrypoint, but this Viem example uses STAKING_PRECOMPILE_ABI instead. That's the correct choice — the VIEM_* constants are widened to Abi, so swapping it in here would degrade result to unknown and break the result.validators / result.nextKey access on the line below — but a reader following the import block will likely make exactly that substitution.

A short parenthetical ("use the as const ABI for full return-type inference; the VIEM_* exports are pre-widened to Abi for cases where you don't need it") would prevent the swap.

functionName: 'validators',
args: ['BOND_STATUS_BONDED', '0x']
});

console.log(result.validators, result.nextKey);
```

## Sei chain definitions

Expand Down
4 changes: 2 additions & 2 deletions packages/precompiles/src/__tests__/barrelParity.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import * as ethersBarrel from '../ethers';
import * as precompilesBarrel from '../precompiles';
import * as viemBarrel from '../viem';

const precompileNamesFrom = (barrel: Record<string, unknown>, prefix: '' | 'ETHERS_' | 'VIEM_'): string[] => {
const precompileNamesFrom = (barrel: Record<string, unknown>, prefix: '' | 'ETHERS_'): string[] => {
const pattern = new RegExp(`^${prefix}([A-Z0-9]+)_PRECOMPILE_ABI$`);

return Object.keys(barrel)
Expand All @@ -14,7 +14,7 @@ const precompileNamesFrom = (barrel: Record<string, unknown>, prefix: '' | 'ETHE
describe('Precompile barrel parity', () => {
const precompileNames = precompileNamesFrom(precompilesBarrel, '');
const ethersNames = precompileNamesFrom(ethersBarrel, 'ETHERS_');
const viemNames = precompileNamesFrom(viemBarrel, 'VIEM_');
const viemNames = precompileNamesFrom(viemBarrel, '');

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nit] This assertion is now tautological. Since src/viem/index.ts became export * from '../precompiles', the viem barrel is the precompiles barrel by construction, so viemNames can never differ from precompileNames and the test below can't fail.

That isn't wrong — the invariant is structurally guaranteed now rather than checked — but the comment on line 19 still describes this as a real guard. Either drop the viem case and note that the re-export makes it unnecessary, or move the check to something that can actually drift (e.g. assert src/viem/index.ts also surfaces the *_PRECOMPILE_ADDRESS constants and the chain definitions, which is the part a consumer migrating off VIEM_BANK_PRECOMPILE_ABI depends on).


// Without this the three comparisons below would pass on three empty sets if the
// ABI naming convention ever changes out from under the pattern above.
Expand Down
5 changes: 5 additions & 0 deletions packages/precompiles/src/__tests__/fixtures/v66/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Sei Chain v6.6 ABI fixtures

The JSON files in this directory are verbatim copies of `precompiles/*/legacy/v66/abi.json` from the [`v6.6.1`](https://github.com/sei-protocol/sei-chain/tree/v6.6.1/precompiles) tag of `sei-chain`.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[suggestion] Question rather than a defect — I couldn't reach the network to settle it, so flagging per the repo guideline on hand-maintained ABIs.

The fixtures are sourced from precompiles/*/legacy/v66/abi.json, and the package README describes legacy/v66 as "a frozen historical snapshot for that release, not a moving view of the current chain surface." Could you confirm that at the v6.6.1 tag legacy/v66 is the highest version directory and matches what mainnet actually serves, rather than a superseded snapshot sitting next to a newer non-legacy precompiles/<mod>/abi.json? If a later ABI exists at that tag, consumers would still be missing methods after this sync — which would undercut the PR's premise.

If legacy/v66 is confirmed as the live surface, a one-line note here saying so (and why legacy/ is the right source) would save the next person the same question.


The parity test compares the package's TypeScript ABI constants with these independently vendored fixtures. IBC and Oracle are retained here to document the complete frozen snapshot, but they are intentionally not exported by `@sei-js/precompiles`.
1 change: 1 addition & 0 deletions packages/precompiles/src/__tests__/fixtures/v66/addr.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[{"inputs":[{"internalType":"string","name":"v","type":"string"},{"internalType":"string","name":"r","type":"string"},{"internalType":"string","name":"s","type":"string"},{"internalType":"string","name":"customMessage","type":"string"}],"name":"associate","outputs":[{"internalType":"string","name":"seiAddr","type":"string"},{"internalType":"address","name":"evmAddr","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"pubKeyHex","type":"string"}],"name":"associatePubKey","outputs":[{"internalType":"string","name":"seiAddr","type":"string"},{"internalType":"address","name":"evmAddr","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getSeiAddr","outputs":[{"internalType":"string","name":"response","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"addr","type":"string"}],"name":"getEvmAddr","outputs":[{"internalType":"address","name":"response","type":"address"}],"stateMutability":"view","type":"function"}]
1 change: 1 addition & 0 deletions packages/precompiles/src/__tests__/fixtures/v66/bank.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[{"inputs":[{"internalType":"address","name":"acc","type":"address"}],"name":"all_balances","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"denom","type":"string"}],"internalType":"struct IBank.Coin[]","name":"response","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"acc","type":"address"},{"internalType":"string","name":"denom","type":"string"}],"name":"balance","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"denom","type":"string"}],"name":"decimals","outputs":[{"internalType":"uint8","name":"response","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"denom","type":"string"}],"name":"name","outputs":[{"internalType":"string","name":"response","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fromAddress","type":"address"},{"internalType":"address","name":"toAddress","type":"address"},{"internalType":"string","name":"denom","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"send","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"toNativeAddress","type":"string"}],"name":"sendNative","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"denom","type":"string"}],"name":"supply","outputs":[{"internalType":"uint256","name":"response","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"denom","type":"string"}],"name":"symbol","outputs":[{"internalType":"string","name":"response","type":"string"}],"stateMutability":"view","type":"function"}]
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":false,"internalType":"string","name":"validator","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DelegationRewardsWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":false,"internalType":"string[]","name":"validators","type":"string[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"MultipleDelegationRewardsWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"validator","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ValidatorCommissionWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawAddr","type":"address"}],"name":"WithdrawAddressSet","type":"event"},{"inputs":[{"internalType":"address","name":"delegatorAddress","type":"address"}],"name":"rewards","outputs":[{"components":[{"components":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"string","name":"denom","type":"string"}],"internalType":"struct IDistr.Coin[]","name":"coins","type":"tuple[]"},{"internalType":"string","name":"validator_address","type":"string"}],"internalType":"struct IDistr.Reward[]","name":"rewards","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"string","name":"denom","type":"string"}],"internalType":"struct IDistr.Coin[]","name":"total","type":"tuple[]"}],"internalType":"struct IDistr.Rewards","name":"rewards","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"withdrawAddr","type":"address"}],"name":"setWithdrawAddress","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"validator","type":"string"}],"name":"withdrawDelegationRewards","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"validators","type":"string[]"}],"name":"withdrawMultipleDelegationRewards","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawValidatorCommission","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
1 change: 1 addition & 0 deletions packages/precompiles/src/__tests__/fixtures/v66/gov.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[{"inputs":[{"internalType":"string","name":"proposalJSON","type":"string"}],"name":"submitProposal","outputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"}],"name":"deposit","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"int32","name":"option","type":"int32"}],"name":"vote","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"components":[{"internalType":"int32","name":"option","type":"int32"},{"internalType":"string","name":"weight","type":"string"}],"internalType":"struct WeightedVoteOption[]","name":"options","type":"tuple[]"}],"name":"voteWeighted","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
1 change: 1 addition & 0 deletions packages/precompiles/src/__tests__/fixtures/v66/ibc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[{"inputs":[{"internalType":"string","name":"toAddress","type":"string"},{"internalType":"string","name":"port","type":"string"},{"internalType":"string","name":"channel","type":"string"},{"internalType":"string","name":"denom","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"},{"internalType":"uint64","name":"timeoutTimestamp","type":"uint64"},{"internalType":"string","name":"memo","type":"string"}],"name":"transfer","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"toAddress","type":"string"},{"internalType":"string","name":"port","type":"string"},{"internalType":"string","name":"channel","type":"string"},{"internalType":"string","name":"denom","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"memo","type":"string"}],"name":"transferWithDefaultTimeout","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
1 change: 1 addition & 0 deletions packages/precompiles/src/__tests__/fixtures/v66/json.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[{"inputs":[{"internalType":"bytes","name":"input","type":"bytes"},{"internalType":"string","name":"key","type":"string"}],"name":"extractAsBytes","outputs":[{"internalType":"bytes","name":"response","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"input","type":"bytes"},{"internalType":"string","name":"key","type":"string"}],"name":"extractAsBytesList","outputs":[{"internalType":"bytes[]","name":"response","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"input","type":"bytes"},{"internalType":"string","name":"key","type":"string"}],"name":"extractAsUint256","outputs":[{"internalType":"uint256","name":"response","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"input","type":"bytes"},{"internalType":"uint16","name":"arrayIndex","type":"uint16"}],"name":"extractAsBytesFromArray","outputs":[{"internalType":"bytes","name":"response","type":"bytes"}],"stateMutability":"view","type":"function"}]
Loading
Loading