From e38818ae256ab71a2ed202caf439f1fad38f7ce2 Mon Sep 17 00:00:00 2001 From: inphi Date: Tue, 31 Jan 2023 16:09:35 -0500 Subject: [PATCH 1/3] Add construction/preprocess tests --- tests/construction_test.go | 158 +++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 tests/construction_test.go diff --git a/tests/construction_test.go b/tests/construction_test.go new file mode 100644 index 0000000..7db86ad --- /dev/null +++ b/tests/construction_test.go @@ -0,0 +1,158 @@ +package tests + +import ( + "context" + "encoding/json" + "testing" + + rosettaGethClient "github.com/coinbase/rosetta-geth-sdk/client" + "github.com/coinbase/rosetta-geth-sdk/configuration" + construction "github.com/coinbase/rosetta-geth-sdk/services/construction" + rosettaGethTypes "github.com/coinbase/rosetta-geth-sdk/types" + rosettaTypes "github.com/coinbase/rosetta-sdk-go/types" + "github.com/ethereum/go-ethereum/params" + "github.com/mdehoog/op-rosetta/pkg/config" + "github.com/mdehoog/op-rosetta/pkg/utils" + "github.com/stretchr/testify/assert" +) + +var ( + OPCurrency = &rosettaTypes.Currency{ + Symbol: "OP", + Decimals: 18, + } +) + +func TestPreprocessERC20(t *testing.T) { + networkID := &rosettaTypes.NetworkIdentifier{ + Blockchain: config.DefaultBlockchain, + Network: "testnet", + } + cfg := &configuration.Configuration{ + Mode: configuration.ModeOnline, + Network: networkID, + ChainConfig: params.TestChainConfig, + } + servicer := construction.NewAPIService(cfg, utils.LoadTypes(), rosettaGethTypes.Errors, nil) + ctx := context.Background() + + intent := ` + [ + {"operation_identifier":{"index":0},"type":"PAYMENT","account":{"address":"0x9670d6977d0b10130E5d4916c9134363281B6B0e"},"amount":{"value":"-100000000000","currency":{"symbol":"OP","decimals":18,"metadata":{"token_address":"0xF8B089026CaD7DDD8CB8d79036A1ff1d4233d64A"}}}}, + {"operation_identifier":{"index":1},"type":"PAYMENT","account":{"address":"0x705f9aE78b11a3ED5080c053Fa4Fa0c52359c674"},"amount":{"value":"100000000000","currency":{"symbol":"OP","decimals":18,"metadata":{"token_address":"0xF8B089026CaD7DDD8CB8d79036A1ff1d4233d64A"}}}} + ] + ` + var ops []*rosettaTypes.Operation + assert.NoError(t, json.Unmarshal([]byte(intent), &ops)) + preprocessResponse, err := servicer.ConstructionPreprocess( + ctx, + &rosettaTypes.ConstructionPreprocessRequest{ + NetworkIdentifier: networkID, + Operations: ops, + }, + ) + assert.Nil(t, err) + optionsRaw := `{"from":"0x9670d6977d0b10130E5d4916c9134363281B6B0e", "to":"0x705f9aE78b11a3ED5080c053Fa4Fa0c52359c674", "data":"0xa9059cbb000000000000000000000000705f9ae78b11a3ed5080c053fa4fa0c52359c674000000000000000000000000000000000000000000000000000000174876e800", "token_address":"0xF8B089026CaD7DDD8CB8d79036A1ff1d4233d64A", "value": "0x0"}` + var options rosettaGethClient.Options + assert.NoError(t, json.Unmarshal([]byte(optionsRaw), &options)) + assert.Equal(t, &rosettaTypes.ConstructionPreprocessResponse{ + Options: forceMarshalMap(t, &options), + }, preprocessResponse) +} + +func TestPreprocessGovernanceDelegate(t *testing.T) { + networkID := &rosettaTypes.NetworkIdentifier{ + Blockchain: config.DefaultBlockchain, + Network: "testnet", + } + cfg := &configuration.Configuration{ + Mode: configuration.ModeOnline, + Network: networkID, + ChainConfig: params.TestChainConfig, + } + servicer := construction.NewAPIService(cfg, utils.LoadTypes(), rosettaGethTypes.Errors, nil) + ctx := context.Background() + + intent := ` +[ + { + "operation_identifier": { + "index": 0 + }, + "type": "DELEGATE_VOTES", + "account": { + "address": "0x9670d6977d0b10130E5d4916c9134363281B6B0e" + }, + "amount": { + "value": "0", + "currency": { + "symbol": "OP", + "decimals": 18, + "metadata": { + "token_address": "0xF8B089026CaD7DDD8CB8d79036A1ff1d4233d64A" + } + } + } + }, + { + "operation_identifier": { + "index": 1 + }, + "type": "DELEGATE_VOTES", + "account": { + "address": "0x705f9aE78b11a3ED5080c053Fa4Fa0c52359c674" + }, + "amount": { + "value": "0", + "currency": { + "symbol": "OP", + "decimals": 18, + "metadata": { + "token_address": "0xF8B089026CaD7DDD8CB8d79036A1ff1d4233d64A" + } + } + } + } +]` + + var ops []*rosettaTypes.Operation + assert.NoError(t, json.Unmarshal([]byte(intent), &ops)) + preprocessResponse, err := servicer.ConstructionPreprocess( + ctx, + &rosettaTypes.ConstructionPreprocessRequest{ + NetworkIdentifier: networkID, + Operations: ops, + }, + ) + assert.Nil(t, err) + optionsRaw := `{"from":"0x9670d6977d0b10130E5d4916c9134363281B6B0e", "to":"0x705f9aE78b11a3ED5080c053Fa4Fa0c52359c674", "data":"0x5c19a95c000000000000000000000000705f9aE78b11a3ED5080c053Fa4Fa0c52359c674", "token_address":"0xF8B089026CaD7DDD8CB8d79036A1ff1d4233d64A", "value": "0x0"}` + var options rosettaGethClient.Options + assert.NoError(t, json.Unmarshal([]byte(optionsRaw), &options)) + assert.Equal(t, &rosettaTypes.ConstructionPreprocessResponse{ + Options: forceMarshalMap(t, &options), + }, preprocessResponse) +} + +// marshalJSONMap converts an interface into a map[string]interface{}. +func marshalJSONMap(i interface{}) (map[string]interface{}, error) { + b, err := json.Marshal(i) + if err != nil { + return nil, err + } + + var m map[string]interface{} + if err := json.Unmarshal(b, &m); err != nil { + return nil, err + } + + return m, nil +} + +func forceMarshalMap(t *testing.T, i interface{}) map[string]interface{} { + m, err := marshalJSONMap(i) + if err != nil { + t.Fatalf("could not marshal map %s", rosettaTypes.PrintStruct(i)) + } + + return m +} From 6e4f1a915c9facc3fab732b30efa2a48a2ff52da Mon Sep 17 00:00:00 2001 From: inphi Date: Tue, 31 Jan 2023 16:31:34 -0500 Subject: [PATCH 2/3] fix expected response schema --- tests/construction_test.go | 61 +++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 33 deletions(-) diff --git a/tests/construction_test.go b/tests/construction_test.go index 7db86ad..cc3f771 100644 --- a/tests/construction_test.go +++ b/tests/construction_test.go @@ -5,7 +5,6 @@ import ( "encoding/json" "testing" - rosettaGethClient "github.com/coinbase/rosetta-geth-sdk/client" "github.com/coinbase/rosetta-geth-sdk/configuration" construction "github.com/coinbase/rosetta-geth-sdk/services/construction" rosettaGethTypes "github.com/coinbase/rosetta-geth-sdk/types" @@ -52,11 +51,20 @@ func TestPreprocessERC20(t *testing.T) { }, ) assert.Nil(t, err) - optionsRaw := `{"from":"0x9670d6977d0b10130E5d4916c9134363281B6B0e", "to":"0x705f9aE78b11a3ED5080c053Fa4Fa0c52359c674", "data":"0xa9059cbb000000000000000000000000705f9ae78b11a3ed5080c053fa4fa0c52359c674000000000000000000000000000000000000000000000000000000174876e800", "token_address":"0xF8B089026CaD7DDD8CB8d79036A1ff1d4233d64A", "value": "0x0"}` - var options rosettaGethClient.Options - assert.NoError(t, json.Unmarshal([]byte(optionsRaw), &options)) + options := map[string]interface{}{ + "from": "0x9670d6977d0b10130E5d4916c9134363281B6B0e", + "to": "0x705f9aE78b11a3ED5080c053Fa4Fa0c52359c674", + "value": "0x0", + "currency": map[string]interface{}{ + "decimals": float64(18), + "symbol": "OP", + "metadata": map[string]interface{}{ + "contractAddress": "0xF8B089026CaD7DDD8CB8d79036A1ff1d4233d64A", + }, + }, + } assert.Equal(t, &rosettaTypes.ConstructionPreprocessResponse{ - Options: forceMarshalMap(t, &options), + Options: options, }, preprocessResponse) } @@ -125,34 +133,21 @@ func TestPreprocessGovernanceDelegate(t *testing.T) { }, ) assert.Nil(t, err) - optionsRaw := `{"from":"0x9670d6977d0b10130E5d4916c9134363281B6B0e", "to":"0x705f9aE78b11a3ED5080c053Fa4Fa0c52359c674", "data":"0x5c19a95c000000000000000000000000705f9aE78b11a3ED5080c053Fa4Fa0c52359c674", "token_address":"0xF8B089026CaD7DDD8CB8d79036A1ff1d4233d64A", "value": "0x0"}` - var options rosettaGethClient.Options - assert.NoError(t, json.Unmarshal([]byte(optionsRaw), &options)) + methodArgs := []interface{}{"0x705f9aE78b11a3ED5080c053Fa4Fa0c52359c674"} + options := map[string]interface{}{ + "from": "0x9670d6977d0b10130E5d4916c9134363281B6B0e", + "to": "0x705f9aE78b11a3ED5080c053Fa4Fa0c52359c674", + "value": "0x0", + "contract_address": "0xF8B089026CaD7DDD8CB8d79036A1ff1d4233d64A", + "data": "0x5c19a95c000000000000000000000000705f9aE78b11a3ED5080c053Fa4Fa0c52359c674", + "method_signature": "delegate(address)", + "method_args": methodArgs, + "currency": map[string]interface{}{ + "decimals": float64(18), + "symbol": "OP", + }, + } assert.Equal(t, &rosettaTypes.ConstructionPreprocessResponse{ - Options: forceMarshalMap(t, &options), + Options: options, }, preprocessResponse) } - -// marshalJSONMap converts an interface into a map[string]interface{}. -func marshalJSONMap(i interface{}) (map[string]interface{}, error) { - b, err := json.Marshal(i) - if err != nil { - return nil, err - } - - var m map[string]interface{} - if err := json.Unmarshal(b, &m); err != nil { - return nil, err - } - - return m, nil -} - -func forceMarshalMap(t *testing.T, i interface{}) map[string]interface{} { - m, err := marshalJSONMap(i) - if err != nil { - t.Fatalf("could not marshal map %s", rosettaTypes.PrintStruct(i)) - } - - return m -} From c219fb9363edc9d8df5abcccf64e6fc6a55f6994 Mon Sep 17 00:00:00 2001 From: Andreas Bigger Date: Thu, 2 Feb 2023 11:11:11 -0500 Subject: [PATCH 3/3] stash: construction tests --- Makefile | 5 + .../{goerli-basic.json => goerli-erc20.json} | 21 +- test/construction_test.go | 184 ++++++++++++++++++ test/test.go | 13 ++ tests/construction_test.go | 153 --------------- 5 files changed, 219 insertions(+), 157 deletions(-) rename configs/optimism/{goerli-basic.json => goerli-erc20.json} (62%) create mode 100644 test/construction_test.go create mode 100644 test/test.go delete mode 100644 tests/construction_test.go diff --git a/Makefile b/Makefile index 5bbf188..85d10cf 100644 --- a/Makefile +++ b/Makefile @@ -79,6 +79,11 @@ run-optimism-goerli-data-check: run-optimism-goerli-construction-check: ROSETTA_CONFIGURATION_FILE=configs/optimism/goerli.json rosetta-cli check:construction configs/optimism/goerli.json +# Runs the rosetta-cli check:construction command with the optimism goerli configuration +run-optimism-goerli-erc20-construction-check: + ROSETTA_CONFIGURATION_FILE=configs/optimism/goerli-erc20.json rosetta-cli check:construction configs/optimism/goerli.json + + # Runs an instance of `op-rosetta` configured for Optimism Goerli # For the genesis block hash, see: # https://github.com/ethereum-optimism/optimism/blob/5e8bc3d5b4f36f0192b22b032e25b09f23cd0985/op-node/chaincfg/chains.go#L49 diff --git a/configs/optimism/goerli-basic.json b/configs/optimism/goerli-erc20.json similarity index 62% rename from configs/optimism/goerli-basic.json rename to configs/optimism/goerli-erc20.json index c891c08..8f35836 100644 --- a/configs/optimism/goerli-basic.json +++ b/configs/optimism/goerli-erc20.json @@ -19,14 +19,27 @@ "all_in_memory_enabled": true, "table_size": 1, "value_log_file_size": 1024, - "construction": null, + "construction": { + "stale_depth": 3, + "broadcast_limit": 5, + "ignore_broadcast_failures": false, + "clear_broadcasts": true, + "constructor_dsl_file": "goerli-erc20.ros", + "quiet": false, + "initial_balance_fetch_disabled": false, + "end_conditions": { + "create_account": 10, + "transfer": 20 + } + }, "data": { "start_index": 4307133, - "reconciliation_disabled": true, + "reconciliation_disabled": false, "inactive_discrepancy_search_disabled": true, - "balance_tracking_disabled": true, - "initial_balance_fetch_disabled":true, + "balance_tracking_disabled": false, + "initial_balance_fetch_disabled": false, "active_reconciliation_concurrency": 32, + "historical_balance_disabled": false, "bootstrap_balances": "", "log_balance_changes": true, "log_transactions": true, diff --git a/test/construction_test.go b/test/construction_test.go new file mode 100644 index 0000000..2de8618 --- /dev/null +++ b/test/construction_test.go @@ -0,0 +1,184 @@ +package test + +import ( + "context" + "encoding/json" + "testing" + + config "github.com/mdehoog/op-rosetta/pkg/config" + utils "github.com/mdehoog/op-rosetta/pkg/utils" + + RosettaConfiguration "github.com/coinbase/rosetta-geth-sdk/configuration" + RosettaConstruction "github.com/coinbase/rosetta-geth-sdk/services/construction" + RosettaGethTypes "github.com/coinbase/rosetta-geth-sdk/types" + RosettaTypes "github.com/coinbase/rosetta-sdk-go/types" + EthParams "github.com/ethereum/go-ethereum/params" + assert "github.com/stretchr/testify/assert" +) + +func TestPreprocessERC20(t *testing.T) { + networkID := &RosettaTypes.NetworkIdentifier{ + Blockchain: config.DefaultBlockchain, + Network: "testnet", + } + cfg := &RosettaConfiguration.Configuration{ + Mode: RosettaConfiguration.ModeOnline, + Network: networkID, + ChainConfig: EthParams.TestChainConfig, + } + servicer := RosettaConstruction.NewAPIService(cfg, utils.LoadTypes(), RosettaGethTypes.Errors, nil) + ctx := context.Background() + + intent := ` + [ + { + "operation_identifier": { + "index":0 + }, + "type":"PAYMENT", + "account": { + "address":"0x9670d6977d0b10130E5d4916c9134363281B6B0e" + }, + "amount": { + "value":"-100000000000", + "currency":{ + "symbol":"OP", + "decimals":18, + "metadata":{ + "token_address":"0xF8B089026CaD7DDD8CB8d79036A1ff1d4233d64A" + } + } + } + }, + { + "operation_identifier": { + "index":1 + }, + "type":"PAYMENT", + "account": { + "address":"0x705f9aE78b11a3ED5080c053Fa4Fa0c52359c674" + }, + "amount": { + "value":"100000000000", + "currency": { + "symbol":"OP", + "decimals":18, + "metadata": { + "token_address":"0xF8B089026CaD7DDD8CB8d79036A1ff1d4233d64A" + } + } + } + } + ] + ` + var ops []*RosettaTypes.Operation + assert.NoError(t, json.Unmarshal([]byte(intent), &ops)) + preprocessResponse, err := servicer.ConstructionPreprocess( + ctx, + &RosettaTypes.ConstructionPreprocessRequest{ + NetworkIdentifier: networkID, + Operations: ops, + }, + ) + assert.Nil(t, err) + options := map[string]interface{}{ + "from": "0x9670d6977d0b10130E5d4916c9134363281B6B0e", + "to": "0x705f9aE78b11a3ED5080c053Fa4Fa0c52359c674", + "value": "0x0", + "currency": map[string]interface{}{ + "decimals": float64(18), + "symbol": "OP", + "metadata": map[string]interface{}{ + "contractAddress": "0xF8B089026CaD7DDD8CB8d79036A1ff1d4233d64A", + }, + }, + } + assert.Equal(t, &RosettaTypes.ConstructionPreprocessResponse{ + Options: options, + }, preprocessResponse) +} + +func TestPreprocessGovernanceDelegate(t *testing.T) { + networkID := &RosettaTypes.NetworkIdentifier{ + Blockchain: config.DefaultBlockchain, + Network: "testnet", + } + cfg := &RosettaConfiguration.Configuration{ + Mode: RosettaConfiguration.ModeOnline, + Network: networkID, + ChainConfig: EthParams.TestChainConfig, + } + servicer := RosettaConstruction.NewAPIService(cfg, utils.LoadTypes(), RosettaGethTypes.Errors, nil) + ctx := context.Background() + + intent := ` + [ + { + "operation_identifier": { + "index": 0 + }, + "type": "DELEGATE_VOTES", + "account": { + "address": "0x9670d6977d0b10130E5d4916c9134363281B6B0e" + }, + "amount": { + "value": "0", + "currency": { + "symbol": "OP", + "decimals": 18, + "metadata": { + "token_address": "0xF8B089026CaD7DDD8CB8d79036A1ff1d4233d64A" + } + } + } + }, + { + "operation_identifier": { + "index": 1 + }, + "type": "DELEGATE_VOTES", + "account": { + "address": "0x705f9aE78b11a3ED5080c053Fa4Fa0c52359c674" + }, + "amount": { + "value": "0", + "currency": { + "symbol": "OP", + "decimals": 18, + "metadata": { + "token_address": "0xF8B089026CaD7DDD8CB8d79036A1ff1d4233d64A" + } + } + } + } + ] + ` + + var ops []*RosettaTypes.Operation + assert.NoError(t, json.Unmarshal([]byte(intent), &ops)) + preprocessResponse, err := servicer.ConstructionPreprocess( + ctx, + &RosettaTypes.ConstructionPreprocessRequest{ + NetworkIdentifier: networkID, + Operations: ops, + }, + ) + assert.Nil(t, err) + methodArgs := []interface{}{"0x705f9aE78b11a3ED5080c053Fa4Fa0c52359c674"} + options := map[string]interface{}{ + "from": "0x9670d6977d0b10130E5d4916c9134363281B6B0e", + "to": "0x705f9aE78b11a3ED5080c053Fa4Fa0c52359c674", + "value": "0x0", + "contract_address": "0xF8B089026CaD7DDD8CB8d79036A1ff1d4233d64A", + "data": "0x5c19a95c000000000000000000000000705f9aE78b11a3ED5080c053Fa4Fa0c52359c674", + "method_signature": "delegate(address)", + "method_args": methodArgs, + "currency": map[string]interface{}{ + "decimals": float64(18), + "symbol": "OP", + }, + } + assert.Equal(t, &RosettaTypes.ConstructionPreprocessResponse{ + Options: options, + }, preprocessResponse) +} diff --git a/test/test.go b/test/test.go new file mode 100644 index 0000000..b629f70 --- /dev/null +++ b/test/test.go @@ -0,0 +1,13 @@ +// Package test contains larger-scoped tests surrounding op-rosetta and it's dependencies. +package test + +import ( + RosettaTypes "github.com/coinbase/rosetta-sdk-go/types" +) + +var ( + OPCurrency = &RosettaTypes.Currency{ + Symbol: "OP", + Decimals: 18, + } +) diff --git a/tests/construction_test.go b/tests/construction_test.go deleted file mode 100644 index cc3f771..0000000 --- a/tests/construction_test.go +++ /dev/null @@ -1,153 +0,0 @@ -package tests - -import ( - "context" - "encoding/json" - "testing" - - "github.com/coinbase/rosetta-geth-sdk/configuration" - construction "github.com/coinbase/rosetta-geth-sdk/services/construction" - rosettaGethTypes "github.com/coinbase/rosetta-geth-sdk/types" - rosettaTypes "github.com/coinbase/rosetta-sdk-go/types" - "github.com/ethereum/go-ethereum/params" - "github.com/mdehoog/op-rosetta/pkg/config" - "github.com/mdehoog/op-rosetta/pkg/utils" - "github.com/stretchr/testify/assert" -) - -var ( - OPCurrency = &rosettaTypes.Currency{ - Symbol: "OP", - Decimals: 18, - } -) - -func TestPreprocessERC20(t *testing.T) { - networkID := &rosettaTypes.NetworkIdentifier{ - Blockchain: config.DefaultBlockchain, - Network: "testnet", - } - cfg := &configuration.Configuration{ - Mode: configuration.ModeOnline, - Network: networkID, - ChainConfig: params.TestChainConfig, - } - servicer := construction.NewAPIService(cfg, utils.LoadTypes(), rosettaGethTypes.Errors, nil) - ctx := context.Background() - - intent := ` - [ - {"operation_identifier":{"index":0},"type":"PAYMENT","account":{"address":"0x9670d6977d0b10130E5d4916c9134363281B6B0e"},"amount":{"value":"-100000000000","currency":{"symbol":"OP","decimals":18,"metadata":{"token_address":"0xF8B089026CaD7DDD8CB8d79036A1ff1d4233d64A"}}}}, - {"operation_identifier":{"index":1},"type":"PAYMENT","account":{"address":"0x705f9aE78b11a3ED5080c053Fa4Fa0c52359c674"},"amount":{"value":"100000000000","currency":{"symbol":"OP","decimals":18,"metadata":{"token_address":"0xF8B089026CaD7DDD8CB8d79036A1ff1d4233d64A"}}}} - ] - ` - var ops []*rosettaTypes.Operation - assert.NoError(t, json.Unmarshal([]byte(intent), &ops)) - preprocessResponse, err := servicer.ConstructionPreprocess( - ctx, - &rosettaTypes.ConstructionPreprocessRequest{ - NetworkIdentifier: networkID, - Operations: ops, - }, - ) - assert.Nil(t, err) - options := map[string]interface{}{ - "from": "0x9670d6977d0b10130E5d4916c9134363281B6B0e", - "to": "0x705f9aE78b11a3ED5080c053Fa4Fa0c52359c674", - "value": "0x0", - "currency": map[string]interface{}{ - "decimals": float64(18), - "symbol": "OP", - "metadata": map[string]interface{}{ - "contractAddress": "0xF8B089026CaD7DDD8CB8d79036A1ff1d4233d64A", - }, - }, - } - assert.Equal(t, &rosettaTypes.ConstructionPreprocessResponse{ - Options: options, - }, preprocessResponse) -} - -func TestPreprocessGovernanceDelegate(t *testing.T) { - networkID := &rosettaTypes.NetworkIdentifier{ - Blockchain: config.DefaultBlockchain, - Network: "testnet", - } - cfg := &configuration.Configuration{ - Mode: configuration.ModeOnline, - Network: networkID, - ChainConfig: params.TestChainConfig, - } - servicer := construction.NewAPIService(cfg, utils.LoadTypes(), rosettaGethTypes.Errors, nil) - ctx := context.Background() - - intent := ` -[ - { - "operation_identifier": { - "index": 0 - }, - "type": "DELEGATE_VOTES", - "account": { - "address": "0x9670d6977d0b10130E5d4916c9134363281B6B0e" - }, - "amount": { - "value": "0", - "currency": { - "symbol": "OP", - "decimals": 18, - "metadata": { - "token_address": "0xF8B089026CaD7DDD8CB8d79036A1ff1d4233d64A" - } - } - } - }, - { - "operation_identifier": { - "index": 1 - }, - "type": "DELEGATE_VOTES", - "account": { - "address": "0x705f9aE78b11a3ED5080c053Fa4Fa0c52359c674" - }, - "amount": { - "value": "0", - "currency": { - "symbol": "OP", - "decimals": 18, - "metadata": { - "token_address": "0xF8B089026CaD7DDD8CB8d79036A1ff1d4233d64A" - } - } - } - } -]` - - var ops []*rosettaTypes.Operation - assert.NoError(t, json.Unmarshal([]byte(intent), &ops)) - preprocessResponse, err := servicer.ConstructionPreprocess( - ctx, - &rosettaTypes.ConstructionPreprocessRequest{ - NetworkIdentifier: networkID, - Operations: ops, - }, - ) - assert.Nil(t, err) - methodArgs := []interface{}{"0x705f9aE78b11a3ED5080c053Fa4Fa0c52359c674"} - options := map[string]interface{}{ - "from": "0x9670d6977d0b10130E5d4916c9134363281B6B0e", - "to": "0x705f9aE78b11a3ED5080c053Fa4Fa0c52359c674", - "value": "0x0", - "contract_address": "0xF8B089026CaD7DDD8CB8d79036A1ff1d4233d64A", - "data": "0x5c19a95c000000000000000000000000705f9aE78b11a3ED5080c053Fa4Fa0c52359c674", - "method_signature": "delegate(address)", - "method_args": methodArgs, - "currency": map[string]interface{}{ - "decimals": float64(18), - "symbol": "OP", - }, - } - assert.Equal(t, &rosettaTypes.ConstructionPreprocessResponse{ - Options: options, - }, preprocessResponse) -}