Skip to content

Commit

Permalink
crypto: use address32 flag (#8542)
Browse files Browse the repository at this point in the history
## Description 

- SuiAddress and ObjectIDs are now 32 bytes along instead of 20 bytes
(in hex, the len increases from 40 to 64)
- Match Secp256k1.deriveKeypair SDK API with Ed25519: takes in mnemonics
and an optional path string.
Specifics: 
- in move: use address::length() as the source of truth for 32
- in rust: use ObjectID::LENGTH as the source of truth for 32
- in ts: a hardcode const SUI_ADDRESS_LENGTH
- shifted object ID changed a few test assumptions, hence changes in
move integration tests, randomness test,
crates/sui-adapter-transactional-tests fixes thanks to Todd N 🙏

## Test Plan 
See all unit tests. e2e tests see: 

![image](https://user-images.githubusercontent.com/108701016/221892622-a6113d67-1ab7-458d-86d7-680747137c03.png)

![image](https://user-images.githubusercontent.com/108701016/221892807-2e04bfa3-72a5-42cd-a4f9-5f83ea0822aa.png)

---
If your changes are not user-facing and not a breaking change, you can
skip the following section. Otherwise, please indicate what changed, and
then add to the Release Notes section as highlighted during the release
process.

### Type of Change (Check all that apply)

- [x] user-visible impact

Any 20 byte old address is invalidated. 

- [x] breaking change for a client SDKs

When 0.29.0 is released for sui, the user MUST upgrade the sui wallet
and SDK to the latest version to interact with the network. This change
is backward incompatible. User needs to reimport their mnemonics or
private key to see an valid 32-byte address.

- [x] breaking change for FNs (FN binary must upgrade)

All move packages and FN can only understand a 32-byte address and fail
all 20-byte addresses.

- [x] breaking change for validators or node operators (must upgrade
binaries)
- [x] breaking change for on-chain data layout

All system objects and IDs are using the new 32-byte representation. 

- [x] necessitate either a data wipe or data migration

All old object IDs and Sui Addresses are invalidated. 

### How to retrieve new address

We cannot derive 32-byte address from 20-byte address. Since an address
is the last 32 bytes of the hash of `flag || public key`, we suggest you
rederive from the mnemonics/privkey and the signature scheme flag.
Download latest sui (0.29.0 or newer)
```
cargo build --bin sui
```
1. In CLI, Use mnemonics

```
target/debug/sui keytool import "$MNEMONICS" ed25519                                                                                                                                                                               
2023-02-28T15:32:10.675501Z  INFO sui::keytool: Key imported for address [$NEW_32_BYTE_ADDRESS]
```

2. In CLI, Use `flag || privkey` base64 string
```
target/debug/sui keytool unpack AJrA997C1eVz6wYIp7bO8dpITSRBXpvg1m70/P3gusu2                                                                                                                                                                                                                                
Address, keypair and key scheme written to $NEW_32_BYTE_ADDRESS.key
```

3. In Typescript, use latest toSuiAddress()

https://github.com/MystenLabs/sui/blob/a67cc044b23a6894dd6d6fa65279d221684559d9/sdk/typescript/src/cryptography/secp256k1-publickey.ts

https://github.com/MystenLabs/sui/blob/a67cc044b23a6894dd6d6fa65279d221684559d9/sdk/typescript/src/cryptography/ed25519-publickey.ts

4. In Rust, use latest pk.into()

https://github.com/MystenLabs/sui/blob/a76d3f0892bb88778d8745e19974dbc7927f821a/crates/sui-types/src/base_types.rs

### Test vectors
The first one is the mnemonics, the second one is a base64 pubkey, the
third one is the derived 32-bytes address in hex.

For Ed25519:

```
[
  [
    'film crazy soon outside stand loop subway crumble thrive popular green nuclear struggle pistol arm wife phrase warfare march wheat nephew ask sunny firm',
    'AN0JMHpDum3BhrVwnkylH0/HGRHBQ/fO/8+MYOawO8j6',
    '8867068daf9111ee013450eea1b1e10ffd62fc874329f0eadadd62b5617011e4',
  ],
  [
    'require decline left thought grid priority false tiny gasp angle royal system attack beef setup reward aunt skill wasp tray vital bounce inflict level',
    'AJrA997C1eVz6wYIp7bO8dpITSRBXpvg1m70/P3gusu2',
    '29bb131378438b6c7f50526e6a853a72ed97f10b75fc8127ca3faaf7e78add30',
  ],
  [
    'organ crash swim stick traffic remember army arctic mesh slice swear summer police vast chaos cradle squirrel hood useless evidence pet hub soap lake',
    'AAEMSIQeqyz09StSwuOW4MElQcZ+4jHW4/QcWlJEf5Yk',
    '6e5387db7249f6b0dc5b68eb095109157dc192a0392343d67688835fecdf14e4',
  ],
]
```

For Secp256k1:
```
[
  [
    'film crazy soon outside stand loop subway crumble thrive popular green nuclear struggle pistol arm wife phrase warfare march wheat nephew ask sunny firm',
    'AQA9EYZoLXirIahsXHQMDfdi5DPQ72wLA79zke4EY6CP',
    '88ea264013bd399f3cc69037aca2d6a0ce6adebb1accd679ab1cad80191894ca',
  ],
  [
    'require decline left thought grid priority false tiny gasp angle royal system attack beef setup reward aunt skill wasp tray vital bounce inflict level',
    'Ae+TTptXI6WaJfzplSrphnrbTD5qgftfMX5kTyca7unQ',
    'fce7538e74e5df59529107d29f24991266e7165961932c205d85e04b00bc8a79',
  ],
  [
    'organ crash swim stick traffic remember army arctic mesh slice swear summer police vast chaos cradle squirrel hood useless evidence pet hub soap lake',
    'AY2iJpGSDMhvGILPjjpyeM1bV4Jky979nUenB5kvQeSj',
    'd6929233d383bc8fa8df95b69feb04d7c7b4fd154d9d59a2564e4d50d14a569d',
  ],
]
```
  • Loading branch information
joyqvq authored Feb 28, 2023
1 parent fe1119d commit a0955c4
Show file tree
Hide file tree
Showing 79 changed files with 815 additions and 638 deletions.
6 changes: 6 additions & 0 deletions .changeset/short-rabbits-live.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@mysten/sui.js": minor
"@mysten/bcs": minor
---

Switch from 20 to 32-byte address. Match Secp256k1.deriveKeypair with Ed25519.
19 changes: 10 additions & 9 deletions .github/workflows/e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,15 +60,16 @@ jobs:
# need to run Wallet e2e when its upstream(TS SDK and Rust) or itself is changed
if: ${{ needs.diff.outputs.isWallet == 'true' || needs.diff.outputs.isRust == 'true' || needs.diff.outputs.isTypescriptSDK == 'true'}}
run: pnpm wallet build
- name: Run Wallet e2e tests
if: ${{ needs.diff.outputs.isWallet == 'true' || needs.diff.outputs.isRust == 'true' || needs.diff.outputs.isTypescriptSDK == 'true'}}
run: xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- pnpm wallet playwright test
- uses: actions/upload-artifact@v3
if: always()
with:
name: playwright-report-wallet
path: apps/wallet/playwright-report/
retention-days: 30
# Disable wallet devenet test,
# - name: Run Wallet e2e tests
# if: ${{ needs.diff.outputs.isWallet == 'true' || needs.diff.outputs.isRust == 'true' || needs.diff.outputs.isTypescriptSDK == 'true'}}
# run: xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- pnpm wallet playwright test
# - uses: actions/upload-artifact@v3
# if: always()
# with:
# name: playwright-report-wallet
# path: apps/wallet/playwright-report/
# retention-days: 30
# Disable devnet tests for now
# Run e2e test against localnet built on the devnet branch for backward compatibility check
# local_devnet_branch:
Expand Down
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ move-bytecode-utils = { git = "https://github.com/move-language/move", rev = "29
move-bytecode-verifier = { git = "https://github.com/move-language/move", rev = "299784312ca360f970c0e75f7a08116d7731ad1d" }
move-cli = { git = "https://github.com/move-language/move", rev = "299784312ca360f970c0e75f7a08116d7731ad1d" }
move-compiler = { git = "https://github.com/move-language/move", rev = "299784312ca360f970c0e75f7a08116d7731ad1d" }
move-core-types = { git = "https://github.com/move-language/move", rev = "299784312ca360f970c0e75f7a08116d7731ad1d", features = ["address20"] }
move-core-types = { git = "https://github.com/move-language/move", rev = "299784312ca360f970c0e75f7a08116d7731ad1d", features = ["address32"] }
move-disassembler = { git = "https://github.com/move-language/move", rev = "299784312ca360f970c0e75f7a08116d7731ad1d" }
move-package = { git = "https://github.com/move-language/move", rev = "299784312ca360f970c0e75f7a08116d7731ad1d" }
move-stdlib = { git = "https://github.com/move-language/move", rev = "299784312ca360f970c0e75f7a08116d7731ad1d" }
Expand Down
3 changes: 1 addition & 2 deletions apps/explorer/src/utils/stringUtils.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
// Copyright (c) Mysten Labs, Inc.
// SPDX-License-Identifier: Apache-2.0

import type { SuiAddress } from '@mysten/sui.js';
import { type SuiAddress, SUI_ADDRESS_LENGTH } from '@mysten/sui.js';

const IPFS_START_STRING = 'https://ipfs.io/ipfs/';
const SUI_ADDRESS_LENGTH = 20;

export function hexToAscii(hex: string) {
if (!hex || typeof hex != 'string') return;
Expand Down
2 changes: 1 addition & 1 deletion apps/wallet/src/background/keyring/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ describe('Keyring', () => {
describe('getActiveAccount', () => {
it('returns as active account the first derived from mnemonic', async () => {
expect((await k.getActiveAccount())!.address).toBe(
'0x9c08076187d961f1ed809a9d803fa49037a92039'
'0x9c08076187d961f1ed809a9d803fa49037a92039d04f539255072713a180dd5c'
);
expect((await k.getActiveAccount())!.derivationPath).toBe(
"m/44'/784'/0'/0'/0'"
Expand Down
8 changes: 5 additions & 3 deletions apps/wallet/src/ui/app/redux/slices/sui-objects/Coin.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
// Copyright (c) Mysten Labs, Inc.
// SPDX-License-Identifier: Apache-2.0

import { Coin as CoinAPI, getTransactionEffects } from '@mysten/sui.js';
import {
Coin as CoinAPI,
getTransactionEffects,
SUI_SYSTEM_STATE_OBJECT_ID,
} from '@mysten/sui.js';
import * as Sentry from '@sentry/react';

import type {
Expand All @@ -21,8 +25,6 @@ export const DEFAULT_GAS_BUDGET_FOR_STAKE = 15000;
export const GAS_TYPE_ARG = '0x2::sui::SUI';
export const GAS_SYMBOL = 'SUI';
export const DEFAULT_NFT_TRANSFER_GAS_FEE = 450;
export const SUI_SYSTEM_STATE_OBJECT_ID =
'0x0000000000000000000000000000000000000005';

// TODO use sdk
export class Coin {
Expand Down
2 changes: 1 addition & 1 deletion apps/wallet/src/ui/app/redux/slices/sui-objects/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
getTotalGasUsed,
getTransactionDigest,
getObjectVersion,
SUI_SYSTEM_STATE_OBJECT_ID,
} from '@mysten/sui.js';
import {
createAsyncThunk,
Expand All @@ -17,7 +18,6 @@ import {
} from '@reduxjs/toolkit';

import { activeAccountSelector } from '../account';
import { SUI_SYSTEM_STATE_OBJECT_ID } from './Coin';
import { ExampleNFT } from './NFT';

import type { SuiObject, SuiAddress, ObjectId } from '@mysten/sui.js';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@ created: object(117), object(118), object(119)
written: object(116)

task 8 'transfer-object'. lines 68-68:
written: object(118), object(120)
written: object(119), object(120)

task 9 'view-object'. lines 70-70:
Owner: Account Address ( B )
Version: 3
Contents: test::m::S {id: sui::object::UID {id: sui::object::ID {bytes: fake(118)}}}
Contents: test::m::S {id: sui::object::UID {id: sui::object::ID {bytes: fake(119)}}}
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,6 @@ module test::m {

//# run test::m::mint --sender A

//# transfer-object 118 --sender A --recipient B
//# transfer-object 119 --sender A --recipient B

//# view-object 118
//# view-object 119
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ written: object(107), object(118)

task 8 'run'. lines 118-118:
written: object(107), object(119)
deleted: object(109), object(111), object(113), object(114)
deleted: object(110), object(111), object(113), object(114)

task 9 'run'. lines 120-120:
written: object(107), object(120)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,11 @@ written: object(112)
task 6 'view-object'. lines 52-52:
Owner: Object ID: ( fake(115) )
Version: 2
Contents: a::m::Obj {id: sui::object::UID {id: sui::object::ID {bytes: fake(113)}}}
Contents: a::m::Obj {id: sui::object::UID {id: sui::object::ID {bytes: fake(114)}}}

task 7 'run'. lines 54-54:
written: object(114), object(116)
deleted: object(113), object(115)
written: object(113), object(116)
deleted: object(114), object(115)

task 8 'run'. lines 57-57:
created: object(118), object(119), object(120)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,9 @@ entry fun take_and_take(obj: &mut Obj, ctx: &mut TxContext) {

//# run a::m::mint --sender A

//# view-object 113
//# view-object 114

//# run a::m::take_and_destroy --sender A --args object(114)
//# run a::m::take_and_destroy --sender A --args object(113)


//# run a::m::mint --sender A
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,4 @@ written: object(109)

task 7 'run'. lines 75-75:
Error: Transaction Effects Status: Move Primitive Runtime Error. Location: sui::event::emit (function index 0) at offset 0. Arithmetic error, stack overflow, max value depth, etc.
Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: MovePrimitiveRuntimeError(Some(MoveLocation { module: ModuleId { address: sui, name: Identifier("event") }, function: 0, instruction: 0, function_name: Some("emit") })), source: Some(VMError { major_status: MEMORY_LIMIT_EXCEEDED, sub_status: Some(1), message: Some("Emitting event of size 300034 bytes. Limit is 262144 bytes."), exec_state: None, location: Module(ModuleId { address: sui, name: Identifier("event") }), indices: [], offsets: [(FunctionDefinitionIndex(0), 0)] }), command: None } }
Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: MovePrimitiveRuntimeError(Some(MoveLocation { module: ModuleId { address: sui, name: Identifier("event") }, function: 0, instruction: 0, function_name: Some("emit") })), source: Some(VMError { major_status: MEMORY_LIMIT_EXCEEDED, sub_status: Some(1), message: Some("Emitting event of size 300046 bytes. Limit is 262144 bytes."), exec_state: None, location: Module(ModuleId { address: sui, name: Identifier("event") }), indices: [], offsets: [(FunctionDefinitionIndex(0), 0)] }), command: None } }
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,11 @@ module Test::M1 {

// create an object whose Move BCS representation is `n` bytes
public fun create_object_with_size(n: u64, ctx: &mut TxContext): S {
// minimum object size for S is 20 bytes for UID + 1 byte for vector length
assert!(n > 21, 0);
// minimum object size for S is 32 bytes for UID + 1 byte for vector length
assert!(n > std::address::length() + 1, 0);
let contents = vector[];
let i = 0;
let bytes_to_add = n - 21;
let bytes_to_add = n - (std::address::length() + 1);
while (i < bytes_to_add) {
vector::push_back(&mut contents, 9);
i = i + 1;
Expand Down Expand Up @@ -89,11 +89,8 @@ module Test::M1 {
//# run Test::M1::add_byte --args object(109)

// create at size limit, wrap, increase to over size limit while wrapped, then unwrap. should fail
//# run Test::M1::transfer_object_with_size --args 255980
//# run Test::M1::transfer_object_with_size --args 255968

//# run Test::M1::wrap --args object(112)

//# run Test::M1::add_bytes_then_unwrap --args object(114) 21



//# run Test::M1::add_bytes_then_unwrap --args object(114) 33
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ created: object(111)
written: object(110)

task 7 'run'. lines 82-82:
events: CoinBalanceChange { package_id: sui, transaction_module: Identifier("gas"), sender: B, change_type: Gas, owner: AddressOwner(B), coin_type: "sui::sui::SUI", coin_object_id: fake(112), version: SequenceNumber(1), amount: -182 }, MutateObject { package_id: test, transaction_module: Identifier("object_basics"), sender: B, object_type: "test::object_basics::Object", object_id: fake(108), version: SequenceNumber(4) }, MutateObject { package_id: sui, transaction_module: Identifier("unused_input_object"), sender: B, object_type: "test::object_basics::Object", object_id: fake(111), version: SequenceNumber(4) }, MoveEvent { package_id: test, transaction_module: Identifier("object_basics"), sender: B, type_: StructTag { address: test, module: Identifier("object_basics"), name: Identifier("NewValueEvent"), type_params: [] }, contents: [20, 0, 0, 0, 0, 0, 0, 0] }
events: CoinBalanceChange { package_id: sui, transaction_module: Identifier("gas"), sender: B, change_type: Gas, owner: AddressOwner(B), coin_type: "sui::sui::SUI", coin_object_id: fake(112), version: SequenceNumber(1), amount: -200 }, MutateObject { package_id: test, transaction_module: Identifier("object_basics"), sender: B, object_type: "test::object_basics::Object", object_id: fake(108), version: SequenceNumber(4) }, MutateObject { package_id: sui, transaction_module: Identifier("unused_input_object"), sender: B, object_type: "test::object_basics::Object", object_id: fake(111), version: SequenceNumber(4) }, MoveEvent { package_id: test, transaction_module: Identifier("object_basics"), sender: B, type_: StructTag { address: test, module: Identifier("object_basics"), name: Identifier("NewValueEvent"), type_params: [] }, contents: [20, 0, 0, 0, 0, 0, 0, 0] }
written: object(108), object(111), object(112)

task 8 'run'. lines 84-84:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,69 +10,69 @@ committee_size: 4
grpc_load_shed: ~
grpc_concurrency_limit: 20000000000
accounts:
- address: 33d3e552666edc4f048c74e0d2776d0b18171e31
- address: 33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b
gas_objects:
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31"
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b"
gas_value: 100000000000000
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31"
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b"
gas_value: 100000000000000
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31"
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b"
gas_value: 100000000000000
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31"
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b"
gas_value: 100000000000000
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31"
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b"
gas_value: 100000000000000
gas_object_ranges: []
- address: 33d3e552666edc4f048c74e0d2776d0b18171e31
- address: 33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b
gas_objects:
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31"
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b"
gas_value: 100000000000000
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31"
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b"
gas_value: 100000000000000
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31"
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b"
gas_value: 100000000000000
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31"
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b"
gas_value: 100000000000000
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31"
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b"
gas_value: 100000000000000
gas_object_ranges: []
- address: 33d3e552666edc4f048c74e0d2776d0b18171e31
- address: 33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b
gas_objects:
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31"
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b"
gas_value: 100000000000000
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31"
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b"
gas_value: 100000000000000
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31"
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b"
gas_value: 100000000000000
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31"
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b"
gas_value: 100000000000000
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31"
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b"
gas_value: 100000000000000
gas_object_ranges: []
- address: 33d3e552666edc4f048c74e0d2776d0b18171e31
- address: 33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b
gas_objects:
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31"
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b"
gas_value: 100000000000000
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31"
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b"
gas_value: 100000000000000
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31"
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b"
gas_value: 100000000000000
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31"
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b"
gas_value: 100000000000000
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31"
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b"
gas_value: 100000000000000
gas_object_ranges: []
- address: 33d3e552666edc4f048c74e0d2776d0b18171e31
- address: 33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b
gas_objects:
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31"
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b"
gas_value: 100000000000000
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31"
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b"
gas_value: 100000000000000
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31"
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b"
gas_value: 100000000000000
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31"
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b"
gas_value: 100000000000000
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31"
- object_id: "0x33d3e552666edc4f048c74e0d2776d0b18171e31c0353e4929e73ba846af602b"
gas_value: 100000000000000
gas_object_ranges: []

Loading

0 comments on commit a0955c4

Please sign in to comment.