diff --git a/rpc/v6/trace.go b/rpc/v6/trace.go index a7eb634369..2ed52aa426 100644 --- a/rpc/v6/trace.go +++ b/rpc/v6/trace.go @@ -84,11 +84,7 @@ type OrderedL2toL1Message struct { // It follows the specification defined here: // https://github.com/starkware-libs/starknet-specs/blob/1ae810e0137cc5d175ace4554892a4f43052be56/api/starknet_trace_api_openrpc.json#L11 func (h *Handler) TraceTransaction(ctx context.Context, hash felt.Felt) (*TransactionTrace, *jsonrpc.Error) { - return h.traceTransaction(ctx, &hash) -} - -func (h *Handler) traceTransaction(ctx context.Context, hash *felt.Felt) (*TransactionTrace, *jsonrpc.Error) { - _, blockHash, _, err := h.bcReader.Receipt(hash) + _, blockHash, _, err := h.bcReader.Receipt(&hash) if err != nil { return nil, rpccore.ErrTxnHashNotFound } @@ -114,7 +110,7 @@ func (h *Handler) traceTransaction(ctx context.Context, hash *felt.Felt) (*Trans } txIndex := slices.IndexFunc(block.Transactions, func(tx core.Transaction) bool { - return tx.Hash().Equal(hash) + return tx.Hash().Equal(&hash) }) if txIndex == -1 { return nil, rpccore.ErrTxnHashNotFound diff --git a/rpc/v6/trace_test.go b/rpc/v6/trace_test.go index c2edebe562..366292d0f9 100644 --- a/rpc/v6/trace_test.go +++ b/rpc/v6/trace_test.go @@ -29,7 +29,7 @@ import ( type expectedBlockTrace struct { blockHash string blockNumber uint64 - trace string + wantTrace string } func TestTraceFallback(t *testing.T) { @@ -38,12 +38,13 @@ func TestTraceFallback(t *testing.T) { "old block": { blockHash: "0x3ae41b0f023e53151b0c8ab8b9caafb7005d5f41c9ab260276d5bdc49726279", blockNumber: 0, - trace: `[ { "trace_root": { "type": "DEPLOY", "constructor_invocation": { "contract_address": "0x7b196a359045d4d0c10f73bdf244a9e1205a615dbb754b8df40173364288534", "entry_point_selector": null, "calldata": [ "0x187d50a5cf3ebd6d4d6fa8e29e4cad0a237759c6416304a25c4ea792ed4bba4", "0x42f5af30d6693674296ad87301935d0c159036c3b24af4042ff0270913bf6c6" ], "caller_address": "0x0", "class_hash": null, "entry_point_type": "", "call_type": "", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 29 } } }, "transaction_hash": "0x3fa1bff0c86f34b2eb32c26d12208b6bdb4a5f6a434ac1d4f0e2d1db71bd711" }, { "trace_root": { "type": "DEPLOY", "constructor_invocation": { "contract_address": "0x64ed79a8ebe97485d3357bbfdf5f6bea0d9db3b5f1feb6e80d564a179122dc6", "entry_point_selector": null, "calldata": [ "0x5cedec15acd969b0fba39fec9e7d9bd4d0b33f100969ad3a4543039a6f696d4", "0xce9801d27b02543f4d88b60aa456860f94ee9f612fc56464abfbdeedc1ab72" ], "caller_address": "0x0", "class_hash": null, "entry_point_type": "", "call_type": "", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 29 } } }, "transaction_hash": "0x154c02cc3165cceadaa32e7238a67061b3a1eac414138c4ebe1408f37fd93eb" }, { "trace_root": { "type": "INVOKE", "execute_invocation": { "contract_address": "0x64ed79a8ebe97485d3357bbfdf5f6bea0d9db3b5f1feb6e80d564a179122dc6", "entry_point_selector": null, "calldata": [ "0x17d9c35a8b9a0d4512fa05eafec01c2758a7a5b7ec7b47408a24a4b33124d9b", "0x2", "0x7f800b5bf79637f8f83f47a8fc4d368b43695c781b22a899f11b5f2faba874a", "0x3a7a40d383612b0ad167aec8d90fb07e576e017d07948f63ac318b52511ae93" ], "caller_address": "0x0", "class_hash": null, "entry_point_type": "", "call_type": "", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 165, "memory_holes": 22, "pedersen_builtin_applications": 2, "range_check_builtin_applications": 7 } } }, "transaction_hash": "0x7893675c16da857b7c4229cda449e08a4fe13b07ca817e79d1db02e8a046047" }, { "trace_root": { "type": "INVOKE", "execute_invocation": { "contract_address": "0x64ed79a8ebe97485d3357bbfdf5f6bea0d9db3b5f1feb6e80d564a179122dc6", "entry_point_selector": null, "calldata": [ "0x17d9c35a8b9a0d4512fa05eafec01c2758a7a5b7ec7b47408a24a4b33124d9b", "0x2", "0x7f800b5bf79637f8f83f47a8fc4d368b43695c781b22a899f11b5f2faba874a", "0xf140b304e9266c72f1054116dd06d9c1c8e981db7bf34e3c6da99640e9a7c8" ], "caller_address": "0x0", "class_hash": null, "entry_point_type": "", "call_type": "", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 165, "memory_holes": 22, "pedersen_builtin_applications": 2, "range_check_builtin_applications": 7 } } }, "transaction_hash": "0x4a277d67e3f42c4a343854081d1e2e9e425f1323255e4486d2badb37a1d8630" } ]`, + wantTrace: `[ { "trace_root": { "type": "DEPLOY", "constructor_invocation": { "contract_address": "0x7b196a359045d4d0c10f73bdf244a9e1205a615dbb754b8df40173364288534", "entry_point_selector": null, "calldata": [ "0x187d50a5cf3ebd6d4d6fa8e29e4cad0a237759c6416304a25c4ea792ed4bba4", "0x42f5af30d6693674296ad87301935d0c159036c3b24af4042ff0270913bf6c6" ], "caller_address": "0x0", "class_hash": null, "entry_point_type": "", "call_type": "", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 29 } } }, "transaction_hash": "0x3fa1bff0c86f34b2eb32c26d12208b6bdb4a5f6a434ac1d4f0e2d1db71bd711" }, { "trace_root": { "type": "DEPLOY", "constructor_invocation": { "contract_address": "0x64ed79a8ebe97485d3357bbfdf5f6bea0d9db3b5f1feb6e80d564a179122dc6", "entry_point_selector": null, "calldata": [ "0x5cedec15acd969b0fba39fec9e7d9bd4d0b33f100969ad3a4543039a6f696d4", "0xce9801d27b02543f4d88b60aa456860f94ee9f612fc56464abfbdeedc1ab72" ], "caller_address": "0x0", "class_hash": null, "entry_point_type": "", "call_type": "", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 29 } } }, "transaction_hash": "0x154c02cc3165cceadaa32e7238a67061b3a1eac414138c4ebe1408f37fd93eb" }, { "trace_root": { "type": "INVOKE", "execute_invocation": { "contract_address": "0x64ed79a8ebe97485d3357bbfdf5f6bea0d9db3b5f1feb6e80d564a179122dc6", "entry_point_selector": null, "calldata": [ "0x17d9c35a8b9a0d4512fa05eafec01c2758a7a5b7ec7b47408a24a4b33124d9b", "0x2", "0x7f800b5bf79637f8f83f47a8fc4d368b43695c781b22a899f11b5f2faba874a", "0x3a7a40d383612b0ad167aec8d90fb07e576e017d07948f63ac318b52511ae93" ], "caller_address": "0x0", "class_hash": null, "entry_point_type": "", "call_type": "", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 165, "memory_holes": 22, "pedersen_builtin_applications": 2, "range_check_builtin_applications": 7 } } }, "transaction_hash": "0x7893675c16da857b7c4229cda449e08a4fe13b07ca817e79d1db02e8a046047" }, { "trace_root": { "type": "INVOKE", "execute_invocation": { "contract_address": "0x64ed79a8ebe97485d3357bbfdf5f6bea0d9db3b5f1feb6e80d564a179122dc6", "entry_point_selector": null, "calldata": [ "0x17d9c35a8b9a0d4512fa05eafec01c2758a7a5b7ec7b47408a24a4b33124d9b", "0x2", "0x7f800b5bf79637f8f83f47a8fc4d368b43695c781b22a899f11b5f2faba874a", "0xf140b304e9266c72f1054116dd06d9c1c8e981db7bf34e3c6da99640e9a7c8" ], "caller_address": "0x0", "class_hash": null, "entry_point_type": "", "call_type": "", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 165, "memory_holes": 22, "pedersen_builtin_applications": 2, "range_check_builtin_applications": 7 } } }, "transaction_hash": "0x4a277d67e3f42c4a343854081d1e2e9e425f1323255e4486d2badb37a1d8630" } ]`, }, + // The newer block still needs to have starknet_version <= 0.13.1 to be fetched from the feeder "newer block": { blockHash: "0xe3828bd9154ab385e2cbb95b3b650365fb3c6a4321660d98ce8b0a9194f9a3", blockNumber: 300000, - trace: `[ { "trace_root": { "type": "INVOKE", "validate_invocation": { "contract_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", "calldata": [ "0x1", "0x332299dc083f3778122e5b7762bc9d399da18fefe93769aee67bb49f51c8d2", "0x2d7cf5d5a324a320f9f37804b1615a533fde487400b41af80f13f7ac5581325", "0x0", "0x4", "0x4", "0xaf35ee8ed700ff132c5d1d298a73becda25ccdf9", "0x2", "0x6cd852fe1b2bbd8587bb0aaeb09813436c57c8ce21e75651e317273a1f22228", "0x58feb991988e53fffcba71f6df23c803fb062f1b3bab126d2c9ce574255b36e" ], "caller_address": "0x0", "class_hash": "0x646a72e2aab2fca75d713fbe4a58f2d12cbd64105621b89dc9ce7045b5bf02b", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 89, "range_check_builtin_applications": 2, "ecdsa_builtin_applications": 1 } }, "execute_invocation": { "contract_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", "calldata": [ "0x1", "0x332299dc083f3778122e5b7762bc9d399da18fefe93769aee67bb49f51c8d2", "0x2d7cf5d5a324a320f9f37804b1615a533fde487400b41af80f13f7ac5581325", "0x0", "0x4", "0x4", "0xaf35ee8ed700ff132c5d1d298a73becda25ccdf9", "0x2", "0x6cd852fe1b2bbd8587bb0aaeb09813436c57c8ce21e75651e317273a1f22228", "0x58feb991988e53fffcba71f6df23c803fb062f1b3bab126d2c9ce574255b36e" ], "caller_address": "0x0", "class_hash": "0x646a72e2aab2fca75d713fbe4a58f2d12cbd64105621b89dc9ce7045b5bf02b", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [ { "contract_address": "0x332299dc083f3778122e5b7762bc9d399da18fefe93769aee67bb49f51c8d2", "entry_point_selector": "0x2d7cf5d5a324a320f9f37804b1615a533fde487400b41af80f13f7ac5581325", "calldata": [ "0xaf35ee8ed700ff132c5d1d298a73becda25ccdf9", "0x2", "0x6cd852fe1b2bbd8587bb0aaeb09813436c57c8ce21e75651e317273a1f22228", "0x58feb991988e53fffcba71f6df23c803fb062f1b3bab126d2c9ce574255b36e" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0x165e7db96ab97a63c621229617a6d49633737238673477a54720e4c952f2c7e", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [ { "order": 0, "from_address": "0x332299dc083f3778122e5b7762bc9d399da18fefe93769aee67bb49f51c8d2", "to_address": "0xaf35ee8ed700ff132c5d1d298a73becda25ccdf9", "payload": [ "0x6cd852fe1b2bbd8587bb0aaeb09813436c57c8ce21e75651e317273a1f22228", "0x58feb991988e53fffcba71f6df23c803fb062f1b3bab126d2c9ce574255b36e" ] } ], "execution_resources": { "steps": 233, "memory_holes": 1, "range_check_builtin_applications": 5 } } ], "events": [], "messages": [], "execution_resources": { "steps": 374, "memory_holes": 4, "range_check_builtin_applications": 7 } }, "fee_transfer_invocation": { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x127089df3a1984", "0x0" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0xd0e183745e9dae3e4e78a8ffedcce0903fc4900beace4e0abf192d4c202da3", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x1" ], "calls": [ { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x127089df3a1984", "0x0" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0x28d7d394810ad8c52741ad8f7564717fd02c10ced68657a81d0b6710ce22079", "entry_point_type": "EXTERNAL", "call_type": "DELEGATE", "result": [ "0x1" ], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 488, "memory_holes": 40, "pedersen_builtin_applications": 4, "range_check_builtin_applications": 21 } } ], "events": [], "messages": [], "execution_resources": { "steps": 548, "memory_holes": 40, "pedersen_builtin_applications": 4, "range_check_builtin_applications": 21 } } }, "transaction_hash": "0x2a648ab1aa6847eb38507fc842e050f256562bf87b26083c332f3f21318c2c3" }, { "trace_root": { "type": "INVOKE", "validate_invocation": { "contract_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", "calldata": [ "0x1", "0x5f9211b05c9609d54a8bf5f9cfa4e2cd5a3cab3b5d79682c585575495a15dd1", "0x317eb442b72a9fae758d4fb26830ed0d9f31c8e7da4dbff4e8c59ea6a158e7f", "0x0", "0x4", "0x4", "0x447379c077035ef4f442411d0407ce9aa66c558f0060137f6455f4f230eabeb", "0x2", "0x6811b7755a7dd0ec1fb6f51a883e3f255368e2dfd497b5f6480c00cf9cd5a2e", "0x23b9e26720dd7aaf98c7cea56499f48f75dc1d4123f7e2d6c23bfc4d5f4a336" ], "caller_address": "0x0", "class_hash": "0x646a72e2aab2fca75d713fbe4a58f2d12cbd64105621b89dc9ce7045b5bf02b", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 89, "range_check_builtin_applications": 2, "ecdsa_builtin_applications": 1 } }, "execute_invocation": { "contract_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", "calldata": [ "0x1", "0x5f9211b05c9609d54a8bf5f9cfa4e2cd5a3cab3b5d79682c585575495a15dd1", "0x317eb442b72a9fae758d4fb26830ed0d9f31c8e7da4dbff4e8c59ea6a158e7f", "0x0", "0x4", "0x4", "0x447379c077035ef4f442411d0407ce9aa66c558f0060137f6455f4f230eabeb", "0x2", "0x6811b7755a7dd0ec1fb6f51a883e3f255368e2dfd497b5f6480c00cf9cd5a2e", "0x23b9e26720dd7aaf98c7cea56499f48f75dc1d4123f7e2d6c23bfc4d5f4a336" ], "caller_address": "0x0", "class_hash": "0x646a72e2aab2fca75d713fbe4a58f2d12cbd64105621b89dc9ce7045b5bf02b", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [ { "contract_address": "0x5f9211b05c9609d54a8bf5f9cfa4e2cd5a3cab3b5d79682c585575495a15dd1", "entry_point_selector": "0x317eb442b72a9fae758d4fb26830ed0d9f31c8e7da4dbff4e8c59ea6a158e7f", "calldata": [ "0x447379c077035ef4f442411d0407ce9aa66c558f0060137f6455f4f230eabeb", "0x2", "0x6811b7755a7dd0ec1fb6f51a883e3f255368e2dfd497b5f6480c00cf9cd5a2e", "0x23b9e26720dd7aaf98c7cea56499f48f75dc1d4123f7e2d6c23bfc4d5f4a336" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0x13abfd2f333f9c69f690f1569140cdae25f6f66e3f371c9cbb998b65f664a85", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 166, "memory_holes": 22, "pedersen_builtin_applications": 2, "range_check_builtin_applications": 7 } } ], "events": [], "messages": [], "execution_resources": { "steps": 307, "memory_holes": 25, "pedersen_builtin_applications": 2, "range_check_builtin_applications": 9 } }, "fee_transfer_invocation": { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x3b2d25cd7bccc", "0x0" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0xd0e183745e9dae3e4e78a8ffedcce0903fc4900beace4e0abf192d4c202da3", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x1" ], "calls": [ { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x3b2d25cd7bccc", "0x0" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0x28d7d394810ad8c52741ad8f7564717fd02c10ced68657a81d0b6710ce22079", "entry_point_type": "EXTERNAL", "call_type": "DELEGATE", "result": [ "0x1" ], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 488, "memory_holes": 40, "pedersen_builtin_applications": 4, "range_check_builtin_applications": 21 } } ], "events": [], "messages": [], "execution_resources": { "steps": 548, "memory_holes": 40, "pedersen_builtin_applications": 4, "range_check_builtin_applications": 21 } } }, "transaction_hash": "0xbc984e8e1fe594dd518a3a51db4f338437a5d2fbdda772d4426b532a67ffff" } ]`, + wantTrace: `[ { "trace_root": { "type": "INVOKE", "validate_invocation": { "contract_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", "calldata": [ "0x1", "0x332299dc083f3778122e5b7762bc9d399da18fefe93769aee67bb49f51c8d2", "0x2d7cf5d5a324a320f9f37804b1615a533fde487400b41af80f13f7ac5581325", "0x0", "0x4", "0x4", "0xaf35ee8ed700ff132c5d1d298a73becda25ccdf9", "0x2", "0x6cd852fe1b2bbd8587bb0aaeb09813436c57c8ce21e75651e317273a1f22228", "0x58feb991988e53fffcba71f6df23c803fb062f1b3bab126d2c9ce574255b36e" ], "caller_address": "0x0", "class_hash": "0x646a72e2aab2fca75d713fbe4a58f2d12cbd64105621b89dc9ce7045b5bf02b", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 89, "range_check_builtin_applications": 2, "ecdsa_builtin_applications": 1 } }, "execute_invocation": { "contract_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", "calldata": [ "0x1", "0x332299dc083f3778122e5b7762bc9d399da18fefe93769aee67bb49f51c8d2", "0x2d7cf5d5a324a320f9f37804b1615a533fde487400b41af80f13f7ac5581325", "0x0", "0x4", "0x4", "0xaf35ee8ed700ff132c5d1d298a73becda25ccdf9", "0x2", "0x6cd852fe1b2bbd8587bb0aaeb09813436c57c8ce21e75651e317273a1f22228", "0x58feb991988e53fffcba71f6df23c803fb062f1b3bab126d2c9ce574255b36e" ], "caller_address": "0x0", "class_hash": "0x646a72e2aab2fca75d713fbe4a58f2d12cbd64105621b89dc9ce7045b5bf02b", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [ { "contract_address": "0x332299dc083f3778122e5b7762bc9d399da18fefe93769aee67bb49f51c8d2", "entry_point_selector": "0x2d7cf5d5a324a320f9f37804b1615a533fde487400b41af80f13f7ac5581325", "calldata": [ "0xaf35ee8ed700ff132c5d1d298a73becda25ccdf9", "0x2", "0x6cd852fe1b2bbd8587bb0aaeb09813436c57c8ce21e75651e317273a1f22228", "0x58feb991988e53fffcba71f6df23c803fb062f1b3bab126d2c9ce574255b36e" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0x165e7db96ab97a63c621229617a6d49633737238673477a54720e4c952f2c7e", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [ { "order": 0, "from_address": "0x332299dc083f3778122e5b7762bc9d399da18fefe93769aee67bb49f51c8d2", "to_address": "0xaf35ee8ed700ff132c5d1d298a73becda25ccdf9", "payload": [ "0x6cd852fe1b2bbd8587bb0aaeb09813436c57c8ce21e75651e317273a1f22228", "0x58feb991988e53fffcba71f6df23c803fb062f1b3bab126d2c9ce574255b36e" ] } ], "execution_resources": { "steps": 233, "memory_holes": 1, "range_check_builtin_applications": 5 } } ], "events": [], "messages": [], "execution_resources": { "steps": 374, "memory_holes": 4, "range_check_builtin_applications": 7 } }, "fee_transfer_invocation": { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x127089df3a1984", "0x0" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0xd0e183745e9dae3e4e78a8ffedcce0903fc4900beace4e0abf192d4c202da3", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x1" ], "calls": [ { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x127089df3a1984", "0x0" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0x28d7d394810ad8c52741ad8f7564717fd02c10ced68657a81d0b6710ce22079", "entry_point_type": "EXTERNAL", "call_type": "DELEGATE", "result": [ "0x1" ], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 488, "memory_holes": 40, "pedersen_builtin_applications": 4, "range_check_builtin_applications": 21 } } ], "events": [], "messages": [], "execution_resources": { "steps": 548, "memory_holes": 40, "pedersen_builtin_applications": 4, "range_check_builtin_applications": 21 } } }, "transaction_hash": "0x2a648ab1aa6847eb38507fc842e050f256562bf87b26083c332f3f21318c2c3" }, { "trace_root": { "type": "INVOKE", "validate_invocation": { "contract_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", "calldata": [ "0x1", "0x5f9211b05c9609d54a8bf5f9cfa4e2cd5a3cab3b5d79682c585575495a15dd1", "0x317eb442b72a9fae758d4fb26830ed0d9f31c8e7da4dbff4e8c59ea6a158e7f", "0x0", "0x4", "0x4", "0x447379c077035ef4f442411d0407ce9aa66c558f0060137f6455f4f230eabeb", "0x2", "0x6811b7755a7dd0ec1fb6f51a883e3f255368e2dfd497b5f6480c00cf9cd5a2e", "0x23b9e26720dd7aaf98c7cea56499f48f75dc1d4123f7e2d6c23bfc4d5f4a336" ], "caller_address": "0x0", "class_hash": "0x646a72e2aab2fca75d713fbe4a58f2d12cbd64105621b89dc9ce7045b5bf02b", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 89, "range_check_builtin_applications": 2, "ecdsa_builtin_applications": 1 } }, "execute_invocation": { "contract_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", "calldata": [ "0x1", "0x5f9211b05c9609d54a8bf5f9cfa4e2cd5a3cab3b5d79682c585575495a15dd1", "0x317eb442b72a9fae758d4fb26830ed0d9f31c8e7da4dbff4e8c59ea6a158e7f", "0x0", "0x4", "0x4", "0x447379c077035ef4f442411d0407ce9aa66c558f0060137f6455f4f230eabeb", "0x2", "0x6811b7755a7dd0ec1fb6f51a883e3f255368e2dfd497b5f6480c00cf9cd5a2e", "0x23b9e26720dd7aaf98c7cea56499f48f75dc1d4123f7e2d6c23bfc4d5f4a336" ], "caller_address": "0x0", "class_hash": "0x646a72e2aab2fca75d713fbe4a58f2d12cbd64105621b89dc9ce7045b5bf02b", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [ { "contract_address": "0x5f9211b05c9609d54a8bf5f9cfa4e2cd5a3cab3b5d79682c585575495a15dd1", "entry_point_selector": "0x317eb442b72a9fae758d4fb26830ed0d9f31c8e7da4dbff4e8c59ea6a158e7f", "calldata": [ "0x447379c077035ef4f442411d0407ce9aa66c558f0060137f6455f4f230eabeb", "0x2", "0x6811b7755a7dd0ec1fb6f51a883e3f255368e2dfd497b5f6480c00cf9cd5a2e", "0x23b9e26720dd7aaf98c7cea56499f48f75dc1d4123f7e2d6c23bfc4d5f4a336" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0x13abfd2f333f9c69f690f1569140cdae25f6f66e3f371c9cbb998b65f664a85", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 166, "memory_holes": 22, "pedersen_builtin_applications": 2, "range_check_builtin_applications": 7 } } ], "events": [], "messages": [], "execution_resources": { "steps": 307, "memory_holes": 25, "pedersen_builtin_applications": 2, "range_check_builtin_applications": 9 } }, "fee_transfer_invocation": { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x3b2d25cd7bccc", "0x0" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0xd0e183745e9dae3e4e78a8ffedcce0903fc4900beace4e0abf192d4c202da3", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x1" ], "calls": [ { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x3b2d25cd7bccc", "0x0" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0x28d7d394810ad8c52741ad8f7564717fd02c10ced68657a81d0b6710ce22079", "entry_point_type": "EXTERNAL", "call_type": "DELEGATE", "result": [ "0x1" ], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 488, "memory_holes": 40, "pedersen_builtin_applications": 4, "range_check_builtin_applications": 21 } } ], "events": [], "messages": [], "execution_resources": { "steps": 548, "memory_holes": 40, "pedersen_builtin_applications": 4, "range_check_builtin_applications": 21 } } }, "transaction_hash": "0xbc984e8e1fe594dd518a3a51db4f338437a5d2fbdda772d4426b532a67ffff" } ]`, }, } @@ -55,13 +56,13 @@ func TestTraceFallback(t *testing.T) { "old block": { blockHash: "0x37644818236ee05b7e3b180bed64ea70ee3dd1553ca334a5c2a290ee276f380", blockNumber: 3, - trace: `[ { "trace_root": { "type": "INVOKE", "validate_invocation": { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", "calldata": [ "0x1", "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "0x0", "0x4", "0x4", "0x1b661756bf7d16210fc611626e1af4569baa1781ffc964bd018f4585ae241c1", "0x0", "0x0", "0x1" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 89, "range_check_builtin_applications": 2, "ecdsa_builtin_applications": 1 } }, "execute_invocation": { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", "calldata": [ "0x1", "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "0x0", "0x4", "0x4", "0x1b661756bf7d16210fc611626e1af4569baa1781ffc964bd018f4585ae241c1", "0x0", "0x0", "0x1" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x23be95f90bf41685e18a4356e57b0cfdc1da22bf382ead8b64108353915c1e5" ], "calls": [ { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "calldata": [ "0x1b661756bf7d16210fc611626e1af4569baa1781ffc964bd018f4585ae241c1", "0x0", "0x0", "0x1" ], "caller_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x23be95f90bf41685e18a4356e57b0cfdc1da22bf382ead8b64108353915c1e5" ], "calls": [ { "contract_address": "0x23be95f90bf41685e18a4356e57b0cfdc1da22bf382ead8b64108353915c1e5", "entry_point_selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194", "calldata": [], "caller_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "class_hash": "0x1b661756bf7d16210fc611626e1af4569baa1781ffc964bd018f4585ae241c1", "entry_point_type": "CONSTRUCTOR", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 0 } } ], "events": [], "messages": [], "execution_resources": { "steps": 69, "memory_holes": 2, "range_check_builtin_applications": 1 } } ], "events": [], "messages": [], "execution_resources": { "steps": 218, "memory_holes": 5, "range_check_builtin_applications": 3 } } }, "transaction_hash": "0x3f786ecc4955a2602c91a291328518ef866cb7f3d50e4b16fd42282952623aa" }, { "trace_root": { "type": "INVOKE", "validate_invocation": { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", "calldata": [ "0x1", "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "0x0", "0x4", "0x4", "0x4f23a756b221f8ce46b72e6a6b10ee7ee6cf3b59790e76e02433104f9a8c5d1", "0x0", "0x0", "0x1" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 89, "range_check_builtin_applications": 2, "ecdsa_builtin_applications": 1 } }, "execute_invocation": { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", "calldata": [ "0x1", "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "0x0", "0x4", "0x4", "0x4f23a756b221f8ce46b72e6a6b10ee7ee6cf3b59790e76e02433104f9a8c5d1", "0x0", "0x0", "0x1" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x6d8ff7b212b08760c82e4a8f354f6ebc69d748290fa38e92eb859726a88f379" ], "calls": [ { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "calldata": [ "0x4f23a756b221f8ce46b72e6a6b10ee7ee6cf3b59790e76e02433104f9a8c5d1", "0x0", "0x0", "0x1" ], "caller_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x6d8ff7b212b08760c82e4a8f354f6ebc69d748290fa38e92eb859726a88f379" ], "calls": [ { "contract_address": "0x6d8ff7b212b08760c82e4a8f354f6ebc69d748290fa38e92eb859726a88f379", "entry_point_selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194", "calldata": [], "caller_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "class_hash": "0x4f23a756b221f8ce46b72e6a6b10ee7ee6cf3b59790e76e02433104f9a8c5d1", "entry_point_type": "CONSTRUCTOR", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 0 } } ], "events": [], "messages": [], "execution_resources": { "steps": 69, "memory_holes": 2, "range_check_builtin_applications": 1 } } ], "events": [], "messages": [], "execution_resources": { "steps": 218, "memory_holes": 5, "range_check_builtin_applications": 3 } } }, "transaction_hash": "0x4010bd7b00e591c163729aa501691e89784c2afe77d71f7b27613e377738843" } ]`, + wantTrace: `[ { "trace_root": { "type": "INVOKE", "validate_invocation": { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", "calldata": [ "0x1", "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "0x0", "0x4", "0x4", "0x1b661756bf7d16210fc611626e1af4569baa1781ffc964bd018f4585ae241c1", "0x0", "0x0", "0x1" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 89, "range_check_builtin_applications": 2, "ecdsa_builtin_applications": 1 } }, "execute_invocation": { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", "calldata": [ "0x1", "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "0x0", "0x4", "0x4", "0x1b661756bf7d16210fc611626e1af4569baa1781ffc964bd018f4585ae241c1", "0x0", "0x0", "0x1" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x23be95f90bf41685e18a4356e57b0cfdc1da22bf382ead8b64108353915c1e5" ], "calls": [ { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "calldata": [ "0x1b661756bf7d16210fc611626e1af4569baa1781ffc964bd018f4585ae241c1", "0x0", "0x0", "0x1" ], "caller_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x23be95f90bf41685e18a4356e57b0cfdc1da22bf382ead8b64108353915c1e5" ], "calls": [ { "contract_address": "0x23be95f90bf41685e18a4356e57b0cfdc1da22bf382ead8b64108353915c1e5", "entry_point_selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194", "calldata": [], "caller_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "class_hash": "0x1b661756bf7d16210fc611626e1af4569baa1781ffc964bd018f4585ae241c1", "entry_point_type": "CONSTRUCTOR", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 0 } } ], "events": [], "messages": [], "execution_resources": { "steps": 69, "memory_holes": 2, "range_check_builtin_applications": 1 } } ], "events": [], "messages": [], "execution_resources": { "steps": 218, "memory_holes": 5, "range_check_builtin_applications": 3 } } }, "transaction_hash": "0x3f786ecc4955a2602c91a291328518ef866cb7f3d50e4b16fd42282952623aa" }, { "trace_root": { "type": "INVOKE", "validate_invocation": { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", "calldata": [ "0x1", "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "0x0", "0x4", "0x4", "0x4f23a756b221f8ce46b72e6a6b10ee7ee6cf3b59790e76e02433104f9a8c5d1", "0x0", "0x0", "0x1" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 89, "range_check_builtin_applications": 2, "ecdsa_builtin_applications": 1 } }, "execute_invocation": { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", "calldata": [ "0x1", "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "0x0", "0x4", "0x4", "0x4f23a756b221f8ce46b72e6a6b10ee7ee6cf3b59790e76e02433104f9a8c5d1", "0x0", "0x0", "0x1" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x6d8ff7b212b08760c82e4a8f354f6ebc69d748290fa38e92eb859726a88f379" ], "calls": [ { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "calldata": [ "0x4f23a756b221f8ce46b72e6a6b10ee7ee6cf3b59790e76e02433104f9a8c5d1", "0x0", "0x0", "0x1" ], "caller_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x6d8ff7b212b08760c82e4a8f354f6ebc69d748290fa38e92eb859726a88f379" ], "calls": [ { "contract_address": "0x6d8ff7b212b08760c82e4a8f354f6ebc69d748290fa38e92eb859726a88f379", "entry_point_selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194", "calldata": [], "caller_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "class_hash": "0x4f23a756b221f8ce46b72e6a6b10ee7ee6cf3b59790e76e02433104f9a8c5d1", "entry_point_type": "CONSTRUCTOR", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 0 } } ], "events": [], "messages": [], "execution_resources": { "steps": 69, "memory_holes": 2, "range_check_builtin_applications": 1 } } ], "events": [], "messages": [], "execution_resources": { "steps": 218, "memory_holes": 5, "range_check_builtin_applications": 3 } } }, "transaction_hash": "0x4010bd7b00e591c163729aa501691e89784c2afe77d71f7b27613e377738843" } ]`, }, // The newer block still needs to have starknet_version <= 0.13.1 to be fetched from the feeder "newer block": { blockHash: "0x733495d0744edd9785b400408fa87c8ad599f81859df544897f80a3fceab422", blockNumber: 40000, - trace: `[ { "trace_root": { "type": "INVOKE", "validate_invocation": { "contract_address": "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", "calldata": [ "0x2", "0x4d0b88ace5705bb7825f91ee95557d906600b7e7762f5615e6a4f407185a43a", "0x3d7905601c217734671143d457f0db37f7f8883112abd34b92c4abfeafde0c3", "0x2", "0x4e946d49fca553930846e35533342f88e59a841c24d9cf507ef28dd6b67cb9b", "0x3ea9c575cfdaa875f3fecaf7db4acdb536ee6b38b8d8a4c769c63d044f942dc", "0x6359ed638df79b82f2f9dbf92abbcb41b57f9dd91ead86b1c85d2dee192c", "0x1a8e87e9d2008fcd3ce423ae5219c21e49be18d05d72825feb7e2bb687ba35c", "0x2", "0x44cd44ad7abf35b9dbe1e17de3610d21", "0x9f806c191aa2a3d47f2b8efc4c412d2f" ], "caller_address": "0x0", "class_hash": "0x2338634f11772ea342365abd5be9d9dc8a6f44f159ad782fdebd3db5d969738", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x56414c4944" ], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 990, "memory_holes": 63, "range_check_builtin_applications": 25, "ec_op_builtin_applications": 3 } }, "execute_invocation": { "contract_address": "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", "calldata": [ "0x2", "0x4d0b88ace5705bb7825f91ee95557d906600b7e7762f5615e6a4f407185a43a", "0x3d7905601c217734671143d457f0db37f7f8883112abd34b92c4abfeafde0c3", "0x2", "0x4e946d49fca553930846e35533342f88e59a841c24d9cf507ef28dd6b67cb9b", "0x3ea9c575cfdaa875f3fecaf7db4acdb536ee6b38b8d8a4c769c63d044f942dc", "0x6359ed638df79b82f2f9dbf92abbcb41b57f9dd91ead86b1c85d2dee192c", "0x1a8e87e9d2008fcd3ce423ae5219c21e49be18d05d72825feb7e2bb687ba35c", "0x2", "0x44cd44ad7abf35b9dbe1e17de3610d21", "0x9f806c191aa2a3d47f2b8efc4c412d2f" ], "caller_address": "0x0", "class_hash": "0x2338634f11772ea342365abd5be9d9dc8a6f44f159ad782fdebd3db5d969738", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x2", "0x0", "0x0" ], "calls": [ { "contract_address": "0x4d0b88ace5705bb7825f91ee95557d906600b7e7762f5615e6a4f407185a43a", "entry_point_selector": "0x3d7905601c217734671143d457f0db37f7f8883112abd34b92c4abfeafde0c3", "calldata": [ "0x4e946d49fca553930846e35533342f88e59a841c24d9cf507ef28dd6b67cb9b", "0x3ea9c575cfdaa875f3fecaf7db4acdb536ee6b38b8d8a4c769c63d044f942dc" ], "caller_address": "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "class_hash": "0x772164c9d6179a89e7f1167f099219f47d752304b16ed01f081b6e0b45c93c3", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 26 } }, { "contract_address": "0x6359ed638df79b82f2f9dbf92abbcb41b57f9dd91ead86b1c85d2dee192c", "entry_point_selector": "0x1a8e87e9d2008fcd3ce423ae5219c21e49be18d05d72825feb7e2bb687ba35c", "calldata": [ "0x44cd44ad7abf35b9dbe1e17de3610d21", "0x9f806c191aa2a3d47f2b8efc4c412d2f" ], "caller_address": "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "class_hash": "0x5a1a156fd2af56bb992ce31fd2a4765e9b65b84efce45f3063974decaa339a2", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 308, "memory_holes": 14, "range_check_builtin_applications": 6 } } ], "events": [], "messages": [], "execution_resources": { "steps": 1419, "memory_holes": 16, "range_check_builtin_applications": 31 } }, "fee_transfer_invocation": { "contract_address": "0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x11ecef7f251258", "0x0" ], "caller_address": "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "class_hash": "0x5327164fa21dca89a92e8eae8a5b7ab90f58373e71f0a16d285e5a4abe5a3cf", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x1" ], "calls": [], "events": [ { "order": 0, "keys": [ "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" ], "data": [ "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x11ecef7f251258", "0x0" ] } ], "messages": [], "execution_resources": { "steps": 876, "memory_holes": 56, "range_check_builtin_applications": 27, "pedersen_builtin_applications": 4 } } }, "transaction_hash": "0x6aa7ec89f36e918c9a168ebc9818e9dd19515a2a4bef87d73e1decbd8a7d131" }, { "trace_root": { "type": "DEPLOY_ACCOUNT", "validate_invocation": { "contract_address": "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "entry_point_selector": "0x36fcbf06cd96843058359e1a75928beacfac10727dab22a3972f0af8aa92895", "calldata": [ "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "0x13e91b7ca4192672", "0x1a3bd006d99712e91bd3fd2eb5fafb0f379d9d594125bb527ec7fc5e133122a" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 75, "ecdsa_builtin_applications": 1 } }, "constructor_invocation": { "contract_address": "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "entry_point_selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194", "calldata": [ "0x1a3bd006d99712e91bd3fd2eb5fafb0f379d9d594125bb527ec7fc5e133122a" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "CONSTRUCTOR", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 41 } }, "fee_transfer_invocation": { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0xe5e432c83b4f", "0x0" ], "caller_address": "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "class_hash": "0x5ffbcfeb50d200a0677c48a129a11245a3fc519d1d98d76882d1c9a1b19c6ed", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x1" ], "calls": [], "events": [ { "order": 0, "keys": [ "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" ], "data": [ "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0xe5e432c83b4f", "0x0" ] } ], "messages": [], "execution_resources": { "steps": 876, "memory_holes": 56, "range_check_builtin_applications": 27, "pedersen_builtin_applications": 4 } } }, "transaction_hash": "0x97468f6928d72808b23fe775e7c71893087600792fb36e0d62ec191363bd34" }, { "trace_root": { "type": "DECLARE", "validate_invocation": { "contract_address": "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "entry_point_selector": "0x289da278a8dc833409cabfdad1581e8e7d40e42dcaed693fa4008dcdb4963b3", "calldata": [ "0x1e7c85ba9d58309d1f257ba201523e1a7b695bfeb6523759da24effd8dc6c0f" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 73, "ecdsa_builtin_applications": 1 } }, "fee_transfer_invocation": { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0xbf730c7e8f2b", "0x0" ], "caller_address": "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "class_hash": "0x5ffbcfeb50d200a0677c48a129a11245a3fc519d1d98d76882d1c9a1b19c6ed", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x1" ], "calls": [], "events": [ { "order": 0, "keys": [ "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" ], "data": [ "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0xbf730c7e8f2b", "0x0" ] } ], "messages": [], "execution_resources": { "steps": 876, "memory_holes": 56, "pedersen_builtin_applications": 4, "range_check_builtin_applications": 27 } } }, "transaction_hash": "0x6a2df1337b09691711a66fca7e93e9f9fbc04c70dc6a17b9284b7af39c1a6a1" } ]`, + wantTrace: `[ { "trace_root": { "type": "INVOKE", "validate_invocation": { "contract_address": "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", "calldata": [ "0x2", "0x4d0b88ace5705bb7825f91ee95557d906600b7e7762f5615e6a4f407185a43a", "0x3d7905601c217734671143d457f0db37f7f8883112abd34b92c4abfeafde0c3", "0x2", "0x4e946d49fca553930846e35533342f88e59a841c24d9cf507ef28dd6b67cb9b", "0x3ea9c575cfdaa875f3fecaf7db4acdb536ee6b38b8d8a4c769c63d044f942dc", "0x6359ed638df79b82f2f9dbf92abbcb41b57f9dd91ead86b1c85d2dee192c", "0x1a8e87e9d2008fcd3ce423ae5219c21e49be18d05d72825feb7e2bb687ba35c", "0x2", "0x44cd44ad7abf35b9dbe1e17de3610d21", "0x9f806c191aa2a3d47f2b8efc4c412d2f" ], "caller_address": "0x0", "class_hash": "0x2338634f11772ea342365abd5be9d9dc8a6f44f159ad782fdebd3db5d969738", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x56414c4944" ], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 990, "memory_holes": 63, "range_check_builtin_applications": 25, "ec_op_builtin_applications": 3 } }, "execute_invocation": { "contract_address": "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", "calldata": [ "0x2", "0x4d0b88ace5705bb7825f91ee95557d906600b7e7762f5615e6a4f407185a43a", "0x3d7905601c217734671143d457f0db37f7f8883112abd34b92c4abfeafde0c3", "0x2", "0x4e946d49fca553930846e35533342f88e59a841c24d9cf507ef28dd6b67cb9b", "0x3ea9c575cfdaa875f3fecaf7db4acdb536ee6b38b8d8a4c769c63d044f942dc", "0x6359ed638df79b82f2f9dbf92abbcb41b57f9dd91ead86b1c85d2dee192c", "0x1a8e87e9d2008fcd3ce423ae5219c21e49be18d05d72825feb7e2bb687ba35c", "0x2", "0x44cd44ad7abf35b9dbe1e17de3610d21", "0x9f806c191aa2a3d47f2b8efc4c412d2f" ], "caller_address": "0x0", "class_hash": "0x2338634f11772ea342365abd5be9d9dc8a6f44f159ad782fdebd3db5d969738", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x2", "0x0", "0x0" ], "calls": [ { "contract_address": "0x4d0b88ace5705bb7825f91ee95557d906600b7e7762f5615e6a4f407185a43a", "entry_point_selector": "0x3d7905601c217734671143d457f0db37f7f8883112abd34b92c4abfeafde0c3", "calldata": [ "0x4e946d49fca553930846e35533342f88e59a841c24d9cf507ef28dd6b67cb9b", "0x3ea9c575cfdaa875f3fecaf7db4acdb536ee6b38b8d8a4c769c63d044f942dc" ], "caller_address": "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "class_hash": "0x772164c9d6179a89e7f1167f099219f47d752304b16ed01f081b6e0b45c93c3", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 26 } }, { "contract_address": "0x6359ed638df79b82f2f9dbf92abbcb41b57f9dd91ead86b1c85d2dee192c", "entry_point_selector": "0x1a8e87e9d2008fcd3ce423ae5219c21e49be18d05d72825feb7e2bb687ba35c", "calldata": [ "0x44cd44ad7abf35b9dbe1e17de3610d21", "0x9f806c191aa2a3d47f2b8efc4c412d2f" ], "caller_address": "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "class_hash": "0x5a1a156fd2af56bb992ce31fd2a4765e9b65b84efce45f3063974decaa339a2", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 308, "memory_holes": 14, "range_check_builtin_applications": 6 } } ], "events": [], "messages": [], "execution_resources": { "steps": 1419, "memory_holes": 16, "range_check_builtin_applications": 31 } }, "fee_transfer_invocation": { "contract_address": "0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x11ecef7f251258", "0x0" ], "caller_address": "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "class_hash": "0x5327164fa21dca89a92e8eae8a5b7ab90f58373e71f0a16d285e5a4abe5a3cf", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x1" ], "calls": [], "events": [ { "order": 0, "keys": [ "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" ], "data": [ "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x11ecef7f251258", "0x0" ] } ], "messages": [], "execution_resources": { "steps": 876, "memory_holes": 56, "range_check_builtin_applications": 27, "pedersen_builtin_applications": 4 } } }, "transaction_hash": "0x6aa7ec89f36e918c9a168ebc9818e9dd19515a2a4bef87d73e1decbd8a7d131" }, { "trace_root": { "type": "DEPLOY_ACCOUNT", "validate_invocation": { "contract_address": "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "entry_point_selector": "0x36fcbf06cd96843058359e1a75928beacfac10727dab22a3972f0af8aa92895", "calldata": [ "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "0x13e91b7ca4192672", "0x1a3bd006d99712e91bd3fd2eb5fafb0f379d9d594125bb527ec7fc5e133122a" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 75, "ecdsa_builtin_applications": 1 } }, "constructor_invocation": { "contract_address": "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "entry_point_selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194", "calldata": [ "0x1a3bd006d99712e91bd3fd2eb5fafb0f379d9d594125bb527ec7fc5e133122a" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "CONSTRUCTOR", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 41 } }, "fee_transfer_invocation": { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0xe5e432c83b4f", "0x0" ], "caller_address": "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "class_hash": "0x5ffbcfeb50d200a0677c48a129a11245a3fc519d1d98d76882d1c9a1b19c6ed", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x1" ], "calls": [], "events": [ { "order": 0, "keys": [ "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" ], "data": [ "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0xe5e432c83b4f", "0x0" ] } ], "messages": [], "execution_resources": { "steps": 876, "memory_holes": 56, "range_check_builtin_applications": 27, "pedersen_builtin_applications": 4 } } }, "transaction_hash": "0x97468f6928d72808b23fe775e7c71893087600792fb36e0d62ec191363bd34" }, { "trace_root": { "type": "DECLARE", "validate_invocation": { "contract_address": "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "entry_point_selector": "0x289da278a8dc833409cabfdad1581e8e7d40e42dcaed693fa4008dcdb4963b3", "calldata": [ "0x1e7c85ba9d58309d1f257ba201523e1a7b695bfeb6523759da24effd8dc6c0f" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 73, "ecdsa_builtin_applications": 1 } }, "fee_transfer_invocation": { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0xbf730c7e8f2b", "0x0" ], "caller_address": "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "class_hash": "0x5ffbcfeb50d200a0677c48a129a11245a3fc519d1d98d76882d1c9a1b19c6ed", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x1" ], "calls": [], "events": [ { "order": 0, "keys": [ "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" ], "data": [ "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0xbf730c7e8f2b", "0x0" ] } ], "messages": [], "execution_resources": { "steps": 876, "memory_holes": 56, "pedersen_builtin_applications": 4, "range_check_builtin_applications": 27 } } }, "transaction_hash": "0x6a2df1337b09691711a66fca7e93e9f9fbc04c70dc6a17b9284b7af39c1a6a1" } ]`, }, } @@ -89,14 +90,9 @@ func AssertTracedBlockTransactions(t *testing.T, n *utils.Network, tests map[str t.Run(description, func(t *testing.T) { mockReader.EXPECT().BlockByHash(utils.HexToFelt(t, test.blockHash)).DoAndReturn(func(_ *felt.Felt) (block *core.Block, err error) { return mockReader.BlockByNumber(test.blockNumber) - }).Times(2) + }) - // Test it returns an error when a feeder client is not set handler := rpc.New(mockReader, nil, nil, "", n, nil) - _, jErr := handler.TraceBlockTransactions(context.Background(), rpc.BlockID{Number: test.blockNumber}) - require.Equal(t, rpccore.ErrInternal.Code, jErr.Code) - - // Test it successfully returns the traces of a block (when a feeder client is set) handler = handler.WithFeeder(client) traces, jErr := handler.TraceBlockTransactions(context.Background(), rpc.BlockID{Number: test.blockNumber}) if n == &utils.Sepolia && description == "newer block" { @@ -107,11 +103,40 @@ func AssertTracedBlockTransactions(t *testing.T, n *utils.Network, tests map[str require.Nil(t, jErr) jsonStr, err := json.Marshal(traces) require.NoError(t, err) - assert.JSONEq(t, test.trace, string(jsonStr)) + assert.JSONEq(t, test.wantTrace, string(jsonStr)) }) } } +func TestTraceBlockTransactionsReturnsError(t *testing.T) { + t.Run("no feeder client set", func(t *testing.T) { + mockCtrl := gomock.NewController(t) + mockReader := mocks.NewMockReader(mockCtrl) + + n := &utils.Sepolia + client := feeder.NewTestClient(t, n) + gateway := adaptfeeder.New(client) + + blockNumber := uint64(40000) + + mockReader.EXPECT().BlockByNumber(gomock.Any()).DoAndReturn(func(number uint64) (block *core.Block, err error) { + return gateway.BlockByNumber(context.Background(), number) + }).Times(2) + mockReader.EXPECT().BlockByHash(gomock.Any()).DoAndReturn(func(_ *felt.Felt) (block *core.Block, err error) { + return mockReader.BlockByNumber(blockNumber) + }) + mockReader.EXPECT().L1Head().Return(nil, db.ErrKeyNotFound).AnyTimes() + + // No feeder client is set + handler := rpc.New(mockReader, nil, nil, "", n, nil) + + tracedBlocks, jErr := handler.TraceBlockTransactions(context.Background(), rpc.BlockID{Number: blockNumber}) + + require.Nil(t, tracedBlocks) + require.Equal(t, rpccore.ErrInternal.Code, jErr.Code) + }) +} + func TestTransactionTraceValidation(t *testing.T) { validInvokeTransactionTrace := rpc.TransactionTrace{ Type: rpc.TxnInvoke, diff --git a/rpc/v7/trace.go b/rpc/v7/trace.go index 56ef27ee2e..ecd2171962 100644 --- a/rpc/v7/trace.go +++ b/rpc/v7/trace.go @@ -81,11 +81,7 @@ func (t *TransactionTrace) allInvocations() []*rpcv6.FunctionInvocation { // It follows the specification defined here: // https://github.com/starkware-libs/starknet-specs/blob/1ae810e0137cc5d175ace4554892a4f43052be56/api/starknet_trace_api_openrpc.json#L11 func (h *Handler) TraceTransaction(ctx context.Context, hash felt.Felt) (*TransactionTrace, http.Header, *jsonrpc.Error) { - return h.traceTransaction(ctx, &hash) -} - -func (h *Handler) traceTransaction(ctx context.Context, hash *felt.Felt) (*TransactionTrace, http.Header, *jsonrpc.Error) { - _, blockHash, _, err := h.bcReader.Receipt(hash) + _, blockHash, _, err := h.bcReader.Receipt(&hash) httpHeader := http.Header{} httpHeader.Set(ExecutionStepsHeader, "0") @@ -112,7 +108,7 @@ func (h *Handler) traceTransaction(ctx context.Context, hash *felt.Felt) (*Trans } txIndex := slices.IndexFunc(block.Transactions, func(tx core.Transaction) bool { - return tx.Hash().Equal(hash) + return tx.Hash().Equal(&hash) }) if txIndex == -1 { return nil, httpHeader, rpccore.ErrTxnHashNotFound diff --git a/rpc/v7/trace_test.go b/rpc/v7/trace_test.go index e4704d8dcf..512f4b37c9 100644 --- a/rpc/v7/trace_test.go +++ b/rpc/v7/trace_test.go @@ -31,7 +31,7 @@ import ( type expectedBlockTrace struct { blockHash string blockNumber uint64 - trace string + wantTrace string } func TestTraceFallback(t *testing.T) { @@ -40,12 +40,13 @@ func TestTraceFallback(t *testing.T) { "old block": { blockHash: "0x3ae41b0f023e53151b0c8ab8b9caafb7005d5f41c9ab260276d5bdc49726279", blockNumber: 0, - trace: `[ { "trace_root": { "type": "DEPLOY", "constructor_invocation": { "contract_address": "0x7b196a359045d4d0c10f73bdf244a9e1205a615dbb754b8df40173364288534", "entry_point_selector": null, "calldata": [ "0x187d50a5cf3ebd6d4d6fa8e29e4cad0a237759c6416304a25c4ea792ed4bba4", "0x42f5af30d6693674296ad87301935d0c159036c3b24af4042ff0270913bf6c6" ], "caller_address": "0x0", "class_hash": null, "entry_point_type": "", "call_type": "", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 29 } }, "execution_resources": { "steps": 29, "data_availability": { "l1_gas": 5, "l1_data_gas": 10 } } }, "transaction_hash": "0x3fa1bff0c86f34b2eb32c26d12208b6bdb4a5f6a434ac1d4f0e2d1db71bd711" }, { "trace_root": { "type": "DEPLOY", "constructor_invocation": { "contract_address": "0x64ed79a8ebe97485d3357bbfdf5f6bea0d9db3b5f1feb6e80d564a179122dc6", "entry_point_selector": null, "calldata": [ "0x5cedec15acd969b0fba39fec9e7d9bd4d0b33f100969ad3a4543039a6f696d4", "0xce9801d27b02543f4d88b60aa456860f94ee9f612fc56464abfbdeedc1ab72" ], "caller_address": "0x0", "class_hash": null, "entry_point_type": "", "call_type": "", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 29 } }, "execution_resources": { "steps": 29, "data_availability": { "l1_gas": 5, "l1_data_gas": 10 } } }, "transaction_hash": "0x154c02cc3165cceadaa32e7238a67061b3a1eac414138c4ebe1408f37fd93eb" }, { "trace_root": { "type": "INVOKE", "execute_invocation": { "contract_address": "0x64ed79a8ebe97485d3357bbfdf5f6bea0d9db3b5f1feb6e80d564a179122dc6", "entry_point_selector": null, "calldata": [ "0x17d9c35a8b9a0d4512fa05eafec01c2758a7a5b7ec7b47408a24a4b33124d9b", "0x2", "0x7f800b5bf79637f8f83f47a8fc4d368b43695c781b22a899f11b5f2faba874a", "0x3a7a40d383612b0ad167aec8d90fb07e576e017d07948f63ac318b52511ae93" ], "caller_address": "0x0", "class_hash": null, "entry_point_type": "", "call_type": "", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 165, "memory_holes": 22, "pedersen_builtin_applications": 2, "range_check_builtin_applications": 7 } }, "execution_resources": { "steps": 165, "memory_holes": 22, "pedersen_builtin_applications": 2, "range_check_builtin_applications": 7, "data_availability": { "l1_gas": 5, "l1_data_gas": 10 } } }, "transaction_hash": "0x7893675c16da857b7c4229cda449e08a4fe13b07ca817e79d1db02e8a046047" }, { "trace_root": { "type": "INVOKE", "execute_invocation": { "contract_address": "0x64ed79a8ebe97485d3357bbfdf5f6bea0d9db3b5f1feb6e80d564a179122dc6", "entry_point_selector": null, "calldata": [ "0x17d9c35a8b9a0d4512fa05eafec01c2758a7a5b7ec7b47408a24a4b33124d9b", "0x2", "0x7f800b5bf79637f8f83f47a8fc4d368b43695c781b22a899f11b5f2faba874a", "0xf140b304e9266c72f1054116dd06d9c1c8e981db7bf34e3c6da99640e9a7c8" ], "caller_address": "0x0", "class_hash": null, "entry_point_type": "", "call_type": "", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 165, "memory_holes": 22, "pedersen_builtin_applications": 2, "range_check_builtin_applications": 7 } }, "execution_resources": { "steps": 165, "memory_holes": 22, "pedersen_builtin_applications": 2, "range_check_builtin_applications": 7, "data_availability": { "l1_gas": 5, "l1_data_gas": 10 } } }, "transaction_hash": "0x4a277d67e3f42c4a343854081d1e2e9e425f1323255e4486d2badb37a1d8630" } ]`, + wantTrace: `[ { "trace_root": { "type": "DEPLOY", "constructor_invocation": { "contract_address": "0x7b196a359045d4d0c10f73bdf244a9e1205a615dbb754b8df40173364288534", "entry_point_selector": null, "calldata": [ "0x187d50a5cf3ebd6d4d6fa8e29e4cad0a237759c6416304a25c4ea792ed4bba4", "0x42f5af30d6693674296ad87301935d0c159036c3b24af4042ff0270913bf6c6" ], "caller_address": "0x0", "class_hash": null, "entry_point_type": "", "call_type": "", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 29 } }, "execution_resources": { "steps": 29, "data_availability": { "l1_gas": 5, "l1_data_gas": 10 } } }, "transaction_hash": "0x3fa1bff0c86f34b2eb32c26d12208b6bdb4a5f6a434ac1d4f0e2d1db71bd711" }, { "trace_root": { "type": "DEPLOY", "constructor_invocation": { "contract_address": "0x64ed79a8ebe97485d3357bbfdf5f6bea0d9db3b5f1feb6e80d564a179122dc6", "entry_point_selector": null, "calldata": [ "0x5cedec15acd969b0fba39fec9e7d9bd4d0b33f100969ad3a4543039a6f696d4", "0xce9801d27b02543f4d88b60aa456860f94ee9f612fc56464abfbdeedc1ab72" ], "caller_address": "0x0", "class_hash": null, "entry_point_type": "", "call_type": "", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 29 } }, "execution_resources": { "steps": 29, "data_availability": { "l1_gas": 5, "l1_data_gas": 10 } } }, "transaction_hash": "0x154c02cc3165cceadaa32e7238a67061b3a1eac414138c4ebe1408f37fd93eb" }, { "trace_root": { "type": "INVOKE", "execute_invocation": { "contract_address": "0x64ed79a8ebe97485d3357bbfdf5f6bea0d9db3b5f1feb6e80d564a179122dc6", "entry_point_selector": null, "calldata": [ "0x17d9c35a8b9a0d4512fa05eafec01c2758a7a5b7ec7b47408a24a4b33124d9b", "0x2", "0x7f800b5bf79637f8f83f47a8fc4d368b43695c781b22a899f11b5f2faba874a", "0x3a7a40d383612b0ad167aec8d90fb07e576e017d07948f63ac318b52511ae93" ], "caller_address": "0x0", "class_hash": null, "entry_point_type": "", "call_type": "", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 165, "memory_holes": 22, "pedersen_builtin_applications": 2, "range_check_builtin_applications": 7 } }, "execution_resources": { "steps": 165, "memory_holes": 22, "pedersen_builtin_applications": 2, "range_check_builtin_applications": 7, "data_availability": { "l1_gas": 5, "l1_data_gas": 10 } } }, "transaction_hash": "0x7893675c16da857b7c4229cda449e08a4fe13b07ca817e79d1db02e8a046047" }, { "trace_root": { "type": "INVOKE", "execute_invocation": { "contract_address": "0x64ed79a8ebe97485d3357bbfdf5f6bea0d9db3b5f1feb6e80d564a179122dc6", "entry_point_selector": null, "calldata": [ "0x17d9c35a8b9a0d4512fa05eafec01c2758a7a5b7ec7b47408a24a4b33124d9b", "0x2", "0x7f800b5bf79637f8f83f47a8fc4d368b43695c781b22a899f11b5f2faba874a", "0xf140b304e9266c72f1054116dd06d9c1c8e981db7bf34e3c6da99640e9a7c8" ], "caller_address": "0x0", "class_hash": null, "entry_point_type": "", "call_type": "", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 165, "memory_holes": 22, "pedersen_builtin_applications": 2, "range_check_builtin_applications": 7 } }, "execution_resources": { "steps": 165, "memory_holes": 22, "pedersen_builtin_applications": 2, "range_check_builtin_applications": 7, "data_availability": { "l1_gas": 5, "l1_data_gas": 10 } } }, "transaction_hash": "0x4a277d67e3f42c4a343854081d1e2e9e425f1323255e4486d2badb37a1d8630" } ]`, }, + // The newer block still needs to have starknet_version <= 0.13.1 to be fetched from the feeder "newer block": { blockHash: "0xe3828bd9154ab385e2cbb95b3b650365fb3c6a4321660d98ce8b0a9194f9a3", blockNumber: 300000, - trace: `[ { "trace_root": { "type": "INVOKE", "validate_invocation": { "contract_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", "calldata": [ "0x1", "0x332299dc083f3778122e5b7762bc9d399da18fefe93769aee67bb49f51c8d2", "0x2d7cf5d5a324a320f9f37804b1615a533fde487400b41af80f13f7ac5581325", "0x0", "0x4", "0x4", "0xaf35ee8ed700ff132c5d1d298a73becda25ccdf9", "0x2", "0x6cd852fe1b2bbd8587bb0aaeb09813436c57c8ce21e75651e317273a1f22228", "0x58feb991988e53fffcba71f6df23c803fb062f1b3bab126d2c9ce574255b36e" ], "caller_address": "0x0", "class_hash": "0x646a72e2aab2fca75d713fbe4a58f2d12cbd64105621b89dc9ce7045b5bf02b", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 89, "range_check_builtin_applications": 2, "ecdsa_builtin_applications": 1 } }, "execute_invocation": { "contract_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", "calldata": [ "0x1", "0x332299dc083f3778122e5b7762bc9d399da18fefe93769aee67bb49f51c8d2", "0x2d7cf5d5a324a320f9f37804b1615a533fde487400b41af80f13f7ac5581325", "0x0", "0x4", "0x4", "0xaf35ee8ed700ff132c5d1d298a73becda25ccdf9", "0x2", "0x6cd852fe1b2bbd8587bb0aaeb09813436c57c8ce21e75651e317273a1f22228", "0x58feb991988e53fffcba71f6df23c803fb062f1b3bab126d2c9ce574255b36e" ], "caller_address": "0x0", "class_hash": "0x646a72e2aab2fca75d713fbe4a58f2d12cbd64105621b89dc9ce7045b5bf02b", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [ { "contract_address": "0x332299dc083f3778122e5b7762bc9d399da18fefe93769aee67bb49f51c8d2", "entry_point_selector": "0x2d7cf5d5a324a320f9f37804b1615a533fde487400b41af80f13f7ac5581325", "calldata": [ "0xaf35ee8ed700ff132c5d1d298a73becda25ccdf9", "0x2", "0x6cd852fe1b2bbd8587bb0aaeb09813436c57c8ce21e75651e317273a1f22228", "0x58feb991988e53fffcba71f6df23c803fb062f1b3bab126d2c9ce574255b36e" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0x165e7db96ab97a63c621229617a6d49633737238673477a54720e4c952f2c7e", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [ { "order": 0, "from_address": "0x332299dc083f3778122e5b7762bc9d399da18fefe93769aee67bb49f51c8d2", "to_address": "0xaf35ee8ed700ff132c5d1d298a73becda25ccdf9", "payload": [ "0x6cd852fe1b2bbd8587bb0aaeb09813436c57c8ce21e75651e317273a1f22228", "0x58feb991988e53fffcba71f6df23c803fb062f1b3bab126d2c9ce574255b36e" ] } ], "execution_resources": { "steps": 233, "memory_holes": 1, "range_check_builtin_applications": 5 } } ], "events": [], "messages": [], "execution_resources": { "steps": 374, "memory_holes": 4, "range_check_builtin_applications": 7 } }, "fee_transfer_invocation": { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x127089df3a1984", "0x0" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0xd0e183745e9dae3e4e78a8ffedcce0903fc4900beace4e0abf192d4c202da3", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x1" ], "calls": [ { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x127089df3a1984", "0x0" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0x28d7d394810ad8c52741ad8f7564717fd02c10ced68657a81d0b6710ce22079", "entry_point_type": "EXTERNAL", "call_type": "DELEGATE", "result": [ "0x1" ], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 488, "memory_holes": 40, "pedersen_builtin_applications": 4, "range_check_builtin_applications": 21 } } ], "events": [], "messages": [], "execution_resources": { "steps": 548, "memory_holes": 40, "pedersen_builtin_applications": 4, "range_check_builtin_applications": 21 } }, "execution_resources": { "steps": 1011, "memory_holes": 44, "pedersen_builtin_applications": 4, "range_check_builtin_applications": 30, "ecdsa_builtin_applications": 1, "data_availability": { "l1_gas": 5, "l1_data_gas": 10 } } }, "transaction_hash": "0x2a648ab1aa6847eb38507fc842e050f256562bf87b26083c332f3f21318c2c3" }, { "trace_root": { "type": "INVOKE", "validate_invocation": { "contract_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", "calldata": [ "0x1", "0x5f9211b05c9609d54a8bf5f9cfa4e2cd5a3cab3b5d79682c585575495a15dd1", "0x317eb442b72a9fae758d4fb26830ed0d9f31c8e7da4dbff4e8c59ea6a158e7f", "0x0", "0x4", "0x4", "0x447379c077035ef4f442411d0407ce9aa66c558f0060137f6455f4f230eabeb", "0x2", "0x6811b7755a7dd0ec1fb6f51a883e3f255368e2dfd497b5f6480c00cf9cd5a2e", "0x23b9e26720dd7aaf98c7cea56499f48f75dc1d4123f7e2d6c23bfc4d5f4a336" ], "caller_address": "0x0", "class_hash": "0x646a72e2aab2fca75d713fbe4a58f2d12cbd64105621b89dc9ce7045b5bf02b", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 89, "range_check_builtin_applications": 2, "ecdsa_builtin_applications": 1 } }, "execute_invocation": { "contract_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", "calldata": [ "0x1", "0x5f9211b05c9609d54a8bf5f9cfa4e2cd5a3cab3b5d79682c585575495a15dd1", "0x317eb442b72a9fae758d4fb26830ed0d9f31c8e7da4dbff4e8c59ea6a158e7f", "0x0", "0x4", "0x4", "0x447379c077035ef4f442411d0407ce9aa66c558f0060137f6455f4f230eabeb", "0x2", "0x6811b7755a7dd0ec1fb6f51a883e3f255368e2dfd497b5f6480c00cf9cd5a2e", "0x23b9e26720dd7aaf98c7cea56499f48f75dc1d4123f7e2d6c23bfc4d5f4a336" ], "caller_address": "0x0", "class_hash": "0x646a72e2aab2fca75d713fbe4a58f2d12cbd64105621b89dc9ce7045b5bf02b", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [ { "contract_address": "0x5f9211b05c9609d54a8bf5f9cfa4e2cd5a3cab3b5d79682c585575495a15dd1", "entry_point_selector": "0x317eb442b72a9fae758d4fb26830ed0d9f31c8e7da4dbff4e8c59ea6a158e7f", "calldata": [ "0x447379c077035ef4f442411d0407ce9aa66c558f0060137f6455f4f230eabeb", "0x2", "0x6811b7755a7dd0ec1fb6f51a883e3f255368e2dfd497b5f6480c00cf9cd5a2e", "0x23b9e26720dd7aaf98c7cea56499f48f75dc1d4123f7e2d6c23bfc4d5f4a336" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0x13abfd2f333f9c69f690f1569140cdae25f6f66e3f371c9cbb998b65f664a85", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 166, "memory_holes": 22, "pedersen_builtin_applications": 2, "range_check_builtin_applications": 7 } } ], "events": [], "messages": [], "execution_resources": { "steps": 307, "memory_holes": 25, "pedersen_builtin_applications": 2, "range_check_builtin_applications": 9 } }, "fee_transfer_invocation": { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x3b2d25cd7bccc", "0x0" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0xd0e183745e9dae3e4e78a8ffedcce0903fc4900beace4e0abf192d4c202da3", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x1" ], "calls": [ { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x3b2d25cd7bccc", "0x0" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0x28d7d394810ad8c52741ad8f7564717fd02c10ced68657a81d0b6710ce22079", "entry_point_type": "EXTERNAL", "call_type": "DELEGATE", "result": [ "0x1" ], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 488, "memory_holes": 40, "pedersen_builtin_applications": 4, "range_check_builtin_applications": 21 } } ], "events": [], "messages": [], "execution_resources": { "steps": 548, "memory_holes": 40, "pedersen_builtin_applications": 4, "range_check_builtin_applications": 21 } }, "execution_resources": { "steps": 944, "memory_holes": 65, "pedersen_builtin_applications": 6, "range_check_builtin_applications": 32, "ecdsa_builtin_applications": 1, "data_availability": { "l1_gas": 5, "l1_data_gas": 10 } } }, "transaction_hash": "0xbc984e8e1fe594dd518a3a51db4f338437a5d2fbdda772d4426b532a67ffff" } ]`, + wantTrace: `[ { "trace_root": { "type": "INVOKE", "validate_invocation": { "contract_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", "calldata": [ "0x1", "0x332299dc083f3778122e5b7762bc9d399da18fefe93769aee67bb49f51c8d2", "0x2d7cf5d5a324a320f9f37804b1615a533fde487400b41af80f13f7ac5581325", "0x0", "0x4", "0x4", "0xaf35ee8ed700ff132c5d1d298a73becda25ccdf9", "0x2", "0x6cd852fe1b2bbd8587bb0aaeb09813436c57c8ce21e75651e317273a1f22228", "0x58feb991988e53fffcba71f6df23c803fb062f1b3bab126d2c9ce574255b36e" ], "caller_address": "0x0", "class_hash": "0x646a72e2aab2fca75d713fbe4a58f2d12cbd64105621b89dc9ce7045b5bf02b", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 89, "range_check_builtin_applications": 2, "ecdsa_builtin_applications": 1 } }, "execute_invocation": { "contract_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", "calldata": [ "0x1", "0x332299dc083f3778122e5b7762bc9d399da18fefe93769aee67bb49f51c8d2", "0x2d7cf5d5a324a320f9f37804b1615a533fde487400b41af80f13f7ac5581325", "0x0", "0x4", "0x4", "0xaf35ee8ed700ff132c5d1d298a73becda25ccdf9", "0x2", "0x6cd852fe1b2bbd8587bb0aaeb09813436c57c8ce21e75651e317273a1f22228", "0x58feb991988e53fffcba71f6df23c803fb062f1b3bab126d2c9ce574255b36e" ], "caller_address": "0x0", "class_hash": "0x646a72e2aab2fca75d713fbe4a58f2d12cbd64105621b89dc9ce7045b5bf02b", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [ { "contract_address": "0x332299dc083f3778122e5b7762bc9d399da18fefe93769aee67bb49f51c8d2", "entry_point_selector": "0x2d7cf5d5a324a320f9f37804b1615a533fde487400b41af80f13f7ac5581325", "calldata": [ "0xaf35ee8ed700ff132c5d1d298a73becda25ccdf9", "0x2", "0x6cd852fe1b2bbd8587bb0aaeb09813436c57c8ce21e75651e317273a1f22228", "0x58feb991988e53fffcba71f6df23c803fb062f1b3bab126d2c9ce574255b36e" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0x165e7db96ab97a63c621229617a6d49633737238673477a54720e4c952f2c7e", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [ { "order": 0, "from_address": "0x332299dc083f3778122e5b7762bc9d399da18fefe93769aee67bb49f51c8d2", "to_address": "0xaf35ee8ed700ff132c5d1d298a73becda25ccdf9", "payload": [ "0x6cd852fe1b2bbd8587bb0aaeb09813436c57c8ce21e75651e317273a1f22228", "0x58feb991988e53fffcba71f6df23c803fb062f1b3bab126d2c9ce574255b36e" ] } ], "execution_resources": { "steps": 233, "memory_holes": 1, "range_check_builtin_applications": 5 } } ], "events": [], "messages": [], "execution_resources": { "steps": 374, "memory_holes": 4, "range_check_builtin_applications": 7 } }, "fee_transfer_invocation": { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x127089df3a1984", "0x0" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0xd0e183745e9dae3e4e78a8ffedcce0903fc4900beace4e0abf192d4c202da3", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x1" ], "calls": [ { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x127089df3a1984", "0x0" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0x28d7d394810ad8c52741ad8f7564717fd02c10ced68657a81d0b6710ce22079", "entry_point_type": "EXTERNAL", "call_type": "DELEGATE", "result": [ "0x1" ], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 488, "memory_holes": 40, "pedersen_builtin_applications": 4, "range_check_builtin_applications": 21 } } ], "events": [], "messages": [], "execution_resources": { "steps": 548, "memory_holes": 40, "pedersen_builtin_applications": 4, "range_check_builtin_applications": 21 } }, "execution_resources": { "steps": 1011, "memory_holes": 44, "pedersen_builtin_applications": 4, "range_check_builtin_applications": 30, "ecdsa_builtin_applications": 1, "data_availability": { "l1_gas": 5, "l1_data_gas": 10 } } }, "transaction_hash": "0x2a648ab1aa6847eb38507fc842e050f256562bf87b26083c332f3f21318c2c3" }, { "trace_root": { "type": "INVOKE", "validate_invocation": { "contract_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", "calldata": [ "0x1", "0x5f9211b05c9609d54a8bf5f9cfa4e2cd5a3cab3b5d79682c585575495a15dd1", "0x317eb442b72a9fae758d4fb26830ed0d9f31c8e7da4dbff4e8c59ea6a158e7f", "0x0", "0x4", "0x4", "0x447379c077035ef4f442411d0407ce9aa66c558f0060137f6455f4f230eabeb", "0x2", "0x6811b7755a7dd0ec1fb6f51a883e3f255368e2dfd497b5f6480c00cf9cd5a2e", "0x23b9e26720dd7aaf98c7cea56499f48f75dc1d4123f7e2d6c23bfc4d5f4a336" ], "caller_address": "0x0", "class_hash": "0x646a72e2aab2fca75d713fbe4a58f2d12cbd64105621b89dc9ce7045b5bf02b", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 89, "range_check_builtin_applications": 2, "ecdsa_builtin_applications": 1 } }, "execute_invocation": { "contract_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", "calldata": [ "0x1", "0x5f9211b05c9609d54a8bf5f9cfa4e2cd5a3cab3b5d79682c585575495a15dd1", "0x317eb442b72a9fae758d4fb26830ed0d9f31c8e7da4dbff4e8c59ea6a158e7f", "0x0", "0x4", "0x4", "0x447379c077035ef4f442411d0407ce9aa66c558f0060137f6455f4f230eabeb", "0x2", "0x6811b7755a7dd0ec1fb6f51a883e3f255368e2dfd497b5f6480c00cf9cd5a2e", "0x23b9e26720dd7aaf98c7cea56499f48f75dc1d4123f7e2d6c23bfc4d5f4a336" ], "caller_address": "0x0", "class_hash": "0x646a72e2aab2fca75d713fbe4a58f2d12cbd64105621b89dc9ce7045b5bf02b", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [ { "contract_address": "0x5f9211b05c9609d54a8bf5f9cfa4e2cd5a3cab3b5d79682c585575495a15dd1", "entry_point_selector": "0x317eb442b72a9fae758d4fb26830ed0d9f31c8e7da4dbff4e8c59ea6a158e7f", "calldata": [ "0x447379c077035ef4f442411d0407ce9aa66c558f0060137f6455f4f230eabeb", "0x2", "0x6811b7755a7dd0ec1fb6f51a883e3f255368e2dfd497b5f6480c00cf9cd5a2e", "0x23b9e26720dd7aaf98c7cea56499f48f75dc1d4123f7e2d6c23bfc4d5f4a336" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0x13abfd2f333f9c69f690f1569140cdae25f6f66e3f371c9cbb998b65f664a85", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 166, "memory_holes": 22, "pedersen_builtin_applications": 2, "range_check_builtin_applications": 7 } } ], "events": [], "messages": [], "execution_resources": { "steps": 307, "memory_holes": 25, "pedersen_builtin_applications": 2, "range_check_builtin_applications": 9 } }, "fee_transfer_invocation": { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x3b2d25cd7bccc", "0x0" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0xd0e183745e9dae3e4e78a8ffedcce0903fc4900beace4e0abf192d4c202da3", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x1" ], "calls": [ { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x3b2d25cd7bccc", "0x0" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0x28d7d394810ad8c52741ad8f7564717fd02c10ced68657a81d0b6710ce22079", "entry_point_type": "EXTERNAL", "call_type": "DELEGATE", "result": [ "0x1" ], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 488, "memory_holes": 40, "pedersen_builtin_applications": 4, "range_check_builtin_applications": 21 } } ], "events": [], "messages": [], "execution_resources": { "steps": 548, "memory_holes": 40, "pedersen_builtin_applications": 4, "range_check_builtin_applications": 21 } }, "execution_resources": { "steps": 944, "memory_holes": 65, "pedersen_builtin_applications": 6, "range_check_builtin_applications": 32, "ecdsa_builtin_applications": 1, "data_availability": { "l1_gas": 5, "l1_data_gas": 10 } } }, "transaction_hash": "0xbc984e8e1fe594dd518a3a51db4f338437a5d2fbdda772d4426b532a67ffff" } ]`, }, } @@ -57,13 +58,13 @@ func TestTraceFallback(t *testing.T) { "old block": { blockHash: "0x37644818236ee05b7e3b180bed64ea70ee3dd1553ca334a5c2a290ee276f380", blockNumber: 3, - trace: `[ { "trace_root": { "type": "INVOKE", "validate_invocation": { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", "calldata": [ "0x1", "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "0x0", "0x4", "0x4", "0x1b661756bf7d16210fc611626e1af4569baa1781ffc964bd018f4585ae241c1", "0x0", "0x0", "0x1" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 89, "range_check_builtin_applications": 2, "ecdsa_builtin_applications": 1 } }, "execute_invocation": { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", "calldata": [ "0x1", "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "0x0", "0x4", "0x4", "0x1b661756bf7d16210fc611626e1af4569baa1781ffc964bd018f4585ae241c1", "0x0", "0x0", "0x1" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x23be95f90bf41685e18a4356e57b0cfdc1da22bf382ead8b64108353915c1e5" ], "calls": [ { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "calldata": [ "0x1b661756bf7d16210fc611626e1af4569baa1781ffc964bd018f4585ae241c1", "0x0", "0x0", "0x1" ], "caller_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x23be95f90bf41685e18a4356e57b0cfdc1da22bf382ead8b64108353915c1e5" ], "calls": [ { "contract_address": "0x23be95f90bf41685e18a4356e57b0cfdc1da22bf382ead8b64108353915c1e5", "entry_point_selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194", "calldata": [], "caller_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "class_hash": "0x1b661756bf7d16210fc611626e1af4569baa1781ffc964bd018f4585ae241c1", "entry_point_type": "CONSTRUCTOR", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 0 } } ], "events": [], "messages": [], "execution_resources": { "steps": 69, "memory_holes": 2, "range_check_builtin_applications": 1 } } ], "events": [], "messages": [], "execution_resources": { "steps": 218, "memory_holes": 5, "range_check_builtin_applications": 3 } }, "execution_resources": { "steps": 307, "memory_holes": 5, "range_check_builtin_applications": 5, "ecdsa_builtin_applications": 1, "data_availability": { "l1_gas": 5, "l1_data_gas": 10 } } }, "transaction_hash": "0x3f786ecc4955a2602c91a291328518ef866cb7f3d50e4b16fd42282952623aa" }, { "trace_root": { "type": "INVOKE", "validate_invocation": { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", "calldata": [ "0x1", "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "0x0", "0x4", "0x4", "0x4f23a756b221f8ce46b72e6a6b10ee7ee6cf3b59790e76e02433104f9a8c5d1", "0x0", "0x0", "0x1" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 89, "range_check_builtin_applications": 2, "ecdsa_builtin_applications": 1 } }, "execute_invocation": { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", "calldata": [ "0x1", "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "0x0", "0x4", "0x4", "0x4f23a756b221f8ce46b72e6a6b10ee7ee6cf3b59790e76e02433104f9a8c5d1", "0x0", "0x0", "0x1" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x6d8ff7b212b08760c82e4a8f354f6ebc69d748290fa38e92eb859726a88f379" ], "calls": [ { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "calldata": [ "0x4f23a756b221f8ce46b72e6a6b10ee7ee6cf3b59790e76e02433104f9a8c5d1", "0x0", "0x0", "0x1" ], "caller_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x6d8ff7b212b08760c82e4a8f354f6ebc69d748290fa38e92eb859726a88f379" ], "calls": [ { "contract_address": "0x6d8ff7b212b08760c82e4a8f354f6ebc69d748290fa38e92eb859726a88f379", "entry_point_selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194", "calldata": [], "caller_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "class_hash": "0x4f23a756b221f8ce46b72e6a6b10ee7ee6cf3b59790e76e02433104f9a8c5d1", "entry_point_type": "CONSTRUCTOR", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 0 } } ], "events": [], "messages": [], "execution_resources": { "steps": 69, "memory_holes": 2, "range_check_builtin_applications": 1 } } ], "events": [], "messages": [], "execution_resources": { "steps": 218, "memory_holes": 5, "range_check_builtin_applications": 3 } }, "execution_resources": { "steps": 307, "memory_holes": 5, "range_check_builtin_applications": 5, "ecdsa_builtin_applications": 1, "data_availability": { "l1_gas": 5, "l1_data_gas": 10 } } }, "transaction_hash": "0x4010bd7b00e591c163729aa501691e89784c2afe77d71f7b27613e377738843" } ]`, + wantTrace: `[ { "trace_root": { "type": "INVOKE", "validate_invocation": { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", "calldata": [ "0x1", "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "0x0", "0x4", "0x4", "0x1b661756bf7d16210fc611626e1af4569baa1781ffc964bd018f4585ae241c1", "0x0", "0x0", "0x1" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 89, "range_check_builtin_applications": 2, "ecdsa_builtin_applications": 1 } }, "execute_invocation": { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", "calldata": [ "0x1", "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "0x0", "0x4", "0x4", "0x1b661756bf7d16210fc611626e1af4569baa1781ffc964bd018f4585ae241c1", "0x0", "0x0", "0x1" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x23be95f90bf41685e18a4356e57b0cfdc1da22bf382ead8b64108353915c1e5" ], "calls": [ { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "calldata": [ "0x1b661756bf7d16210fc611626e1af4569baa1781ffc964bd018f4585ae241c1", "0x0", "0x0", "0x1" ], "caller_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x23be95f90bf41685e18a4356e57b0cfdc1da22bf382ead8b64108353915c1e5" ], "calls": [ { "contract_address": "0x23be95f90bf41685e18a4356e57b0cfdc1da22bf382ead8b64108353915c1e5", "entry_point_selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194", "calldata": [], "caller_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "class_hash": "0x1b661756bf7d16210fc611626e1af4569baa1781ffc964bd018f4585ae241c1", "entry_point_type": "CONSTRUCTOR", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 0 } } ], "events": [], "messages": [], "execution_resources": { "steps": 69, "memory_holes": 2, "range_check_builtin_applications": 1 } } ], "events": [], "messages": [], "execution_resources": { "steps": 218, "memory_holes": 5, "range_check_builtin_applications": 3 } }, "execution_resources": { "steps": 307, "memory_holes": 5, "range_check_builtin_applications": 5, "ecdsa_builtin_applications": 1, "data_availability": { "l1_gas": 5, "l1_data_gas": 10 } } }, "transaction_hash": "0x3f786ecc4955a2602c91a291328518ef866cb7f3d50e4b16fd42282952623aa" }, { "trace_root": { "type": "INVOKE", "validate_invocation": { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", "calldata": [ "0x1", "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "0x0", "0x4", "0x4", "0x4f23a756b221f8ce46b72e6a6b10ee7ee6cf3b59790e76e02433104f9a8c5d1", "0x0", "0x0", "0x1" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 89, "range_check_builtin_applications": 2, "ecdsa_builtin_applications": 1 } }, "execute_invocation": { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", "calldata": [ "0x1", "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "0x0", "0x4", "0x4", "0x4f23a756b221f8ce46b72e6a6b10ee7ee6cf3b59790e76e02433104f9a8c5d1", "0x0", "0x0", "0x1" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x6d8ff7b212b08760c82e4a8f354f6ebc69d748290fa38e92eb859726a88f379" ], "calls": [ { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "calldata": [ "0x4f23a756b221f8ce46b72e6a6b10ee7ee6cf3b59790e76e02433104f9a8c5d1", "0x0", "0x0", "0x1" ], "caller_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x6d8ff7b212b08760c82e4a8f354f6ebc69d748290fa38e92eb859726a88f379" ], "calls": [ { "contract_address": "0x6d8ff7b212b08760c82e4a8f354f6ebc69d748290fa38e92eb859726a88f379", "entry_point_selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194", "calldata": [], "caller_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "class_hash": "0x4f23a756b221f8ce46b72e6a6b10ee7ee6cf3b59790e76e02433104f9a8c5d1", "entry_point_type": "CONSTRUCTOR", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 0 } } ], "events": [], "messages": [], "execution_resources": { "steps": 69, "memory_holes": 2, "range_check_builtin_applications": 1 } } ], "events": [], "messages": [], "execution_resources": { "steps": 218, "memory_holes": 5, "range_check_builtin_applications": 3 } }, "execution_resources": { "steps": 307, "memory_holes": 5, "range_check_builtin_applications": 5, "ecdsa_builtin_applications": 1, "data_availability": { "l1_gas": 5, "l1_data_gas": 10 } } }, "transaction_hash": "0x4010bd7b00e591c163729aa501691e89784c2afe77d71f7b27613e377738843" } ]`, }, // The newer block still needs to have starknet_version <= 0.13.1 to be fetched from the feeder "newer block": { blockHash: "0x733495d0744edd9785b400408fa87c8ad599f81859df544897f80a3fceab422", blockNumber: 40000, - trace: `[ { "trace_root": { "type": "INVOKE", "validate_invocation": { "contract_address": "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", "calldata": [ "0x2", "0x4d0b88ace5705bb7825f91ee95557d906600b7e7762f5615e6a4f407185a43a", "0x3d7905601c217734671143d457f0db37f7f8883112abd34b92c4abfeafde0c3", "0x2", "0x4e946d49fca553930846e35533342f88e59a841c24d9cf507ef28dd6b67cb9b", "0x3ea9c575cfdaa875f3fecaf7db4acdb536ee6b38b8d8a4c769c63d044f942dc", "0x6359ed638df79b82f2f9dbf92abbcb41b57f9dd91ead86b1c85d2dee192c", "0x1a8e87e9d2008fcd3ce423ae5219c21e49be18d05d72825feb7e2bb687ba35c", "0x2", "0x44cd44ad7abf35b9dbe1e17de3610d21", "0x9f806c191aa2a3d47f2b8efc4c412d2f" ], "caller_address": "0x0", "class_hash": "0x2338634f11772ea342365abd5be9d9dc8a6f44f159ad782fdebd3db5d969738", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x56414c4944" ], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 990, "memory_holes": 63, "range_check_builtin_applications": 25, "ec_op_builtin_applications": 3 } }, "execute_invocation": { "contract_address": "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", "calldata": [ "0x2", "0x4d0b88ace5705bb7825f91ee95557d906600b7e7762f5615e6a4f407185a43a", "0x3d7905601c217734671143d457f0db37f7f8883112abd34b92c4abfeafde0c3", "0x2", "0x4e946d49fca553930846e35533342f88e59a841c24d9cf507ef28dd6b67cb9b", "0x3ea9c575cfdaa875f3fecaf7db4acdb536ee6b38b8d8a4c769c63d044f942dc", "0x6359ed638df79b82f2f9dbf92abbcb41b57f9dd91ead86b1c85d2dee192c", "0x1a8e87e9d2008fcd3ce423ae5219c21e49be18d05d72825feb7e2bb687ba35c", "0x2", "0x44cd44ad7abf35b9dbe1e17de3610d21", "0x9f806c191aa2a3d47f2b8efc4c412d2f" ], "caller_address": "0x0", "class_hash": "0x2338634f11772ea342365abd5be9d9dc8a6f44f159ad782fdebd3db5d969738", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x2", "0x0", "0x0" ], "calls": [ { "contract_address": "0x4d0b88ace5705bb7825f91ee95557d906600b7e7762f5615e6a4f407185a43a", "entry_point_selector": "0x3d7905601c217734671143d457f0db37f7f8883112abd34b92c4abfeafde0c3", "calldata": [ "0x4e946d49fca553930846e35533342f88e59a841c24d9cf507ef28dd6b67cb9b", "0x3ea9c575cfdaa875f3fecaf7db4acdb536ee6b38b8d8a4c769c63d044f942dc" ], "caller_address": "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "class_hash": "0x772164c9d6179a89e7f1167f099219f47d752304b16ed01f081b6e0b45c93c3", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 26 } }, { "contract_address": "0x6359ed638df79b82f2f9dbf92abbcb41b57f9dd91ead86b1c85d2dee192c", "entry_point_selector": "0x1a8e87e9d2008fcd3ce423ae5219c21e49be18d05d72825feb7e2bb687ba35c", "calldata": [ "0x44cd44ad7abf35b9dbe1e17de3610d21", "0x9f806c191aa2a3d47f2b8efc4c412d2f" ], "caller_address": "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "class_hash": "0x5a1a156fd2af56bb992ce31fd2a4765e9b65b84efce45f3063974decaa339a2", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 308, "memory_holes": 14, "range_check_builtin_applications": 6 } } ], "events": [], "messages": [], "execution_resources": { "steps": 1419, "memory_holes": 16, "range_check_builtin_applications": 31 } }, "fee_transfer_invocation": { "contract_address": "0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x11ecef7f251258", "0x0" ], "caller_address": "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "class_hash": "0x5327164fa21dca89a92e8eae8a5b7ab90f58373e71f0a16d285e5a4abe5a3cf", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x1" ], "calls": [], "events": [ { "order": 0, "keys": [ "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" ], "data": [ "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x11ecef7f251258", "0x0" ] } ], "messages": [], "execution_resources": { "steps": 876, "memory_holes": 56, "range_check_builtin_applications": 27, "pedersen_builtin_applications": 4 } }, "execution_resources": { "steps": 3285, "memory_holes": 135, "range_check_builtin_applications": 83, "pedersen_builtin_applications": 4, "ec_op_builtin_applications": 3, "data_availability": { "l1_gas": 5, "l1_data_gas": 10 } } }, "transaction_hash": "0x6aa7ec89f36e918c9a168ebc9818e9dd19515a2a4bef87d73e1decbd8a7d131" }, { "trace_root": { "type": "DEPLOY_ACCOUNT", "validate_invocation": { "contract_address": "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "entry_point_selector": "0x36fcbf06cd96843058359e1a75928beacfac10727dab22a3972f0af8aa92895", "calldata": [ "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "0x13e91b7ca4192672", "0x1a3bd006d99712e91bd3fd2eb5fafb0f379d9d594125bb527ec7fc5e133122a" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 75, "ecdsa_builtin_applications": 1 } }, "constructor_invocation": { "contract_address": "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "entry_point_selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194", "calldata": [ "0x1a3bd006d99712e91bd3fd2eb5fafb0f379d9d594125bb527ec7fc5e133122a" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "CONSTRUCTOR", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 41 } }, "fee_transfer_invocation": { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0xe5e432c83b4f", "0x0" ], "caller_address": "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "class_hash": "0x5ffbcfeb50d200a0677c48a129a11245a3fc519d1d98d76882d1c9a1b19c6ed", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x1" ], "calls": [], "events": [ { "order": 0, "keys": [ "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" ], "data": [ "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0xe5e432c83b4f", "0x0" ] } ], "messages": [], "execution_resources": { "steps": 876, "memory_holes": 56, "range_check_builtin_applications": 27, "pedersen_builtin_applications": 4 } }, "execution_resources": { "steps": 992, "memory_holes": 56, "range_check_builtin_applications": 27, "pedersen_builtin_applications": 4, "ecdsa_builtin_applications": 1, "data_availability": { "l1_gas": 5, "l1_data_gas": 10 } } }, "transaction_hash": "0x97468f6928d72808b23fe775e7c71893087600792fb36e0d62ec191363bd34" }, { "trace_root": { "type": "DECLARE", "validate_invocation": { "contract_address": "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "entry_point_selector": "0x289da278a8dc833409cabfdad1581e8e7d40e42dcaed693fa4008dcdb4963b3", "calldata": [ "0x1e7c85ba9d58309d1f257ba201523e1a7b695bfeb6523759da24effd8dc6c0f" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 73, "ecdsa_builtin_applications": 1 } }, "fee_transfer_invocation": { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0xbf730c7e8f2b", "0x0" ], "caller_address": "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "class_hash": "0x5ffbcfeb50d200a0677c48a129a11245a3fc519d1d98d76882d1c9a1b19c6ed", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x1" ], "calls": [], "events": [ { "order": 0, "keys": [ "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" ], "data": [ "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0xbf730c7e8f2b", "0x0" ] } ], "messages": [], "execution_resources": { "steps": 876, "memory_holes": 56, "pedersen_builtin_applications": 4, "range_check_builtin_applications": 27 } }, "execution_resources": { "steps": 949, "memory_holes": 56, "range_check_builtin_applications": 27, "pedersen_builtin_applications": 4, "ecdsa_builtin_applications": 1, "data_availability": { "l1_gas": 5, "l1_data_gas": 10 } } }, "transaction_hash": "0x6a2df1337b09691711a66fca7e93e9f9fbc04c70dc6a17b9284b7af39c1a6a1" } ]`, + wantTrace: `[ { "trace_root": { "type": "INVOKE", "validate_invocation": { "contract_address": "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", "calldata": [ "0x2", "0x4d0b88ace5705bb7825f91ee95557d906600b7e7762f5615e6a4f407185a43a", "0x3d7905601c217734671143d457f0db37f7f8883112abd34b92c4abfeafde0c3", "0x2", "0x4e946d49fca553930846e35533342f88e59a841c24d9cf507ef28dd6b67cb9b", "0x3ea9c575cfdaa875f3fecaf7db4acdb536ee6b38b8d8a4c769c63d044f942dc", "0x6359ed638df79b82f2f9dbf92abbcb41b57f9dd91ead86b1c85d2dee192c", "0x1a8e87e9d2008fcd3ce423ae5219c21e49be18d05d72825feb7e2bb687ba35c", "0x2", "0x44cd44ad7abf35b9dbe1e17de3610d21", "0x9f806c191aa2a3d47f2b8efc4c412d2f" ], "caller_address": "0x0", "class_hash": "0x2338634f11772ea342365abd5be9d9dc8a6f44f159ad782fdebd3db5d969738", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x56414c4944" ], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 990, "memory_holes": 63, "range_check_builtin_applications": 25, "ec_op_builtin_applications": 3 } }, "execute_invocation": { "contract_address": "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", "calldata": [ "0x2", "0x4d0b88ace5705bb7825f91ee95557d906600b7e7762f5615e6a4f407185a43a", "0x3d7905601c217734671143d457f0db37f7f8883112abd34b92c4abfeafde0c3", "0x2", "0x4e946d49fca553930846e35533342f88e59a841c24d9cf507ef28dd6b67cb9b", "0x3ea9c575cfdaa875f3fecaf7db4acdb536ee6b38b8d8a4c769c63d044f942dc", "0x6359ed638df79b82f2f9dbf92abbcb41b57f9dd91ead86b1c85d2dee192c", "0x1a8e87e9d2008fcd3ce423ae5219c21e49be18d05d72825feb7e2bb687ba35c", "0x2", "0x44cd44ad7abf35b9dbe1e17de3610d21", "0x9f806c191aa2a3d47f2b8efc4c412d2f" ], "caller_address": "0x0", "class_hash": "0x2338634f11772ea342365abd5be9d9dc8a6f44f159ad782fdebd3db5d969738", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x2", "0x0", "0x0" ], "calls": [ { "contract_address": "0x4d0b88ace5705bb7825f91ee95557d906600b7e7762f5615e6a4f407185a43a", "entry_point_selector": "0x3d7905601c217734671143d457f0db37f7f8883112abd34b92c4abfeafde0c3", "calldata": [ "0x4e946d49fca553930846e35533342f88e59a841c24d9cf507ef28dd6b67cb9b", "0x3ea9c575cfdaa875f3fecaf7db4acdb536ee6b38b8d8a4c769c63d044f942dc" ], "caller_address": "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "class_hash": "0x772164c9d6179a89e7f1167f099219f47d752304b16ed01f081b6e0b45c93c3", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 26 } }, { "contract_address": "0x6359ed638df79b82f2f9dbf92abbcb41b57f9dd91ead86b1c85d2dee192c", "entry_point_selector": "0x1a8e87e9d2008fcd3ce423ae5219c21e49be18d05d72825feb7e2bb687ba35c", "calldata": [ "0x44cd44ad7abf35b9dbe1e17de3610d21", "0x9f806c191aa2a3d47f2b8efc4c412d2f" ], "caller_address": "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "class_hash": "0x5a1a156fd2af56bb992ce31fd2a4765e9b65b84efce45f3063974decaa339a2", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 308, "memory_holes": 14, "range_check_builtin_applications": 6 } } ], "events": [], "messages": [], "execution_resources": { "steps": 1419, "memory_holes": 16, "range_check_builtin_applications": 31 } }, "fee_transfer_invocation": { "contract_address": "0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x11ecef7f251258", "0x0" ], "caller_address": "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "class_hash": "0x5327164fa21dca89a92e8eae8a5b7ab90f58373e71f0a16d285e5a4abe5a3cf", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x1" ], "calls": [], "events": [ { "order": 0, "keys": [ "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" ], "data": [ "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x11ecef7f251258", "0x0" ] } ], "messages": [], "execution_resources": { "steps": 876, "memory_holes": 56, "range_check_builtin_applications": 27, "pedersen_builtin_applications": 4 } }, "execution_resources": { "steps": 3285, "memory_holes": 135, "range_check_builtin_applications": 83, "pedersen_builtin_applications": 4, "ec_op_builtin_applications": 3, "data_availability": { "l1_gas": 5, "l1_data_gas": 10 } } }, "transaction_hash": "0x6aa7ec89f36e918c9a168ebc9818e9dd19515a2a4bef87d73e1decbd8a7d131" }, { "trace_root": { "type": "DEPLOY_ACCOUNT", "validate_invocation": { "contract_address": "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "entry_point_selector": "0x36fcbf06cd96843058359e1a75928beacfac10727dab22a3972f0af8aa92895", "calldata": [ "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "0x13e91b7ca4192672", "0x1a3bd006d99712e91bd3fd2eb5fafb0f379d9d594125bb527ec7fc5e133122a" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 75, "ecdsa_builtin_applications": 1 } }, "constructor_invocation": { "contract_address": "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "entry_point_selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194", "calldata": [ "0x1a3bd006d99712e91bd3fd2eb5fafb0f379d9d594125bb527ec7fc5e133122a" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "CONSTRUCTOR", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 41 } }, "fee_transfer_invocation": { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0xe5e432c83b4f", "0x0" ], "caller_address": "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "class_hash": "0x5ffbcfeb50d200a0677c48a129a11245a3fc519d1d98d76882d1c9a1b19c6ed", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x1" ], "calls": [], "events": [ { "order": 0, "keys": [ "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" ], "data": [ "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0xe5e432c83b4f", "0x0" ] } ], "messages": [], "execution_resources": { "steps": 876, "memory_holes": 56, "range_check_builtin_applications": 27, "pedersen_builtin_applications": 4 } }, "execution_resources": { "steps": 992, "memory_holes": 56, "range_check_builtin_applications": 27, "pedersen_builtin_applications": 4, "ecdsa_builtin_applications": 1, "data_availability": { "l1_gas": 5, "l1_data_gas": 10 } } }, "transaction_hash": "0x97468f6928d72808b23fe775e7c71893087600792fb36e0d62ec191363bd34" }, { "trace_root": { "type": "DECLARE", "validate_invocation": { "contract_address": "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "entry_point_selector": "0x289da278a8dc833409cabfdad1581e8e7d40e42dcaed693fa4008dcdb4963b3", "calldata": [ "0x1e7c85ba9d58309d1f257ba201523e1a7b695bfeb6523759da24effd8dc6c0f" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "steps": 73, "ecdsa_builtin_applications": 1 } }, "fee_transfer_invocation": { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0xbf730c7e8f2b", "0x0" ], "caller_address": "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "class_hash": "0x5ffbcfeb50d200a0677c48a129a11245a3fc519d1d98d76882d1c9a1b19c6ed", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x1" ], "calls": [], "events": [ { "order": 0, "keys": [ "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" ], "data": [ "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0xbf730c7e8f2b", "0x0" ] } ], "messages": [], "execution_resources": { "steps": 876, "memory_holes": 56, "pedersen_builtin_applications": 4, "range_check_builtin_applications": 27 } }, "execution_resources": { "steps": 949, "memory_holes": 56, "range_check_builtin_applications": 27, "pedersen_builtin_applications": 4, "ecdsa_builtin_applications": 1, "data_availability": { "l1_gas": 5, "l1_data_gas": 10 } } }, "transaction_hash": "0x6a2df1337b09691711a66fca7e93e9f9fbc04c70dc6a17b9284b7af39c1a6a1" } ]`, }, } @@ -101,15 +102,9 @@ func AssertTracedBlockTransactions(t *testing.T, n *utils.Network, tests map[str t.Run(description, func(t *testing.T) { mockReader.EXPECT().BlockByHash(utils.HexToFelt(t, test.blockHash)).DoAndReturn(func(_ *felt.Felt) (block *core.Block, err error) { return mockReader.BlockByNumber(test.blockNumber) - }).Times(2) + }) - // Test it returns an error when a feeder client is not set handler := rpcv7.New(mockReader, nil, nil, "", n, nil) - _, httpHeader, jErr := handler.TraceBlockTransactions(context.Background(), rpcv7.BlockID{Number: test.blockNumber}) - require.Equal(t, rpccore.ErrInternal.Code, jErr.Code) - assert.Equal(t, httpHeader.Get(rpcv7.ExecutionStepsHeader), "0") - - // Test it successfully returns the traces of a block (when a feeder client is set) handler = handler.WithFeeder(client) traces, httpHeader, jErr := handler.TraceBlockTransactions(context.Background(), rpcv7.BlockID{Number: test.blockNumber}) if n == &utils.Sepolia && description == "newer block" { @@ -122,11 +117,41 @@ func AssertTracedBlockTransactions(t *testing.T, n *utils.Network, tests map[str jsonStr, err := json.Marshal(traces) require.NoError(t, err) - assert.JSONEq(t, test.trace, string(jsonStr)) + assert.JSONEq(t, test.wantTrace, string(jsonStr)) }) } } +func TestTraceBlockTransactionsReturnsError(t *testing.T) { + t.Run("no feeder client set", func(t *testing.T) { + mockCtrl := gomock.NewController(t) + mockReader := mocks.NewMockReader(mockCtrl) + + n := &utils.Sepolia + client := feeder.NewTestClient(t, n) + gateway := adaptfeeder.New(client) + + blockNumber := uint64(40000) + + mockReader.EXPECT().BlockByNumber(gomock.Any()).DoAndReturn(func(number uint64) (block *core.Block, err error) { + return gateway.BlockByNumber(context.Background(), number) + }).Times(2) + mockReader.EXPECT().BlockByHash(gomock.Any()).DoAndReturn(func(_ *felt.Felt) (block *core.Block, err error) { + return mockReader.BlockByNumber(blockNumber) + }) + mockReader.EXPECT().L1Head().Return(nil, db.ErrKeyNotFound).AnyTimes() + + // No feeder client is set + handler := rpcv7.New(mockReader, nil, nil, "", n, nil) + + tracedBlocks, httpHeader, jErr := handler.TraceBlockTransactions(context.Background(), rpcv7.BlockID{Number: blockNumber}) + + require.Nil(t, tracedBlocks) + require.Equal(t, rpccore.ErrInternal.Code, jErr.Code) + assert.Equal(t, httpHeader.Get(rpcv7.ExecutionStepsHeader), "0") + }) +} + func TestTransactionTraceValidation(t *testing.T) { validInvokeTransactionTrace := rpcv7.TransactionTrace{ Type: rpcv7.TxnInvoke, diff --git a/rpc/v8/adapters.go b/rpc/v8/adapters.go new file mode 100644 index 0000000000..f7749151dd --- /dev/null +++ b/rpc/v8/adapters.go @@ -0,0 +1,271 @@ +package rpcv8 + +import ( + "errors" + + "github.com/NethermindEth/juno/core/felt" + rpcv6 "github.com/NethermindEth/juno/rpc/v6" + "github.com/NethermindEth/juno/starknet" + "github.com/NethermindEth/juno/utils" + "github.com/NethermindEth/juno/vm" +) + +/**************************************************** + VM Adapters +*****************************************************/ + +func AdaptVMTransactionTrace(trace *vm.TransactionTrace) TransactionTrace { + var validateInvocation *FunctionInvocation + if trace.ValidateInvocation != nil && trace.Type != vm.TxnL1Handler { + validateInvocation = utils.HeapPtr(adaptVMFunctionInvocation(trace.ValidateInvocation)) + } + + var feeTransferInvocation *FunctionInvocation + if trace.FeeTransferInvocation != nil && trace.Type != vm.TxnL1Handler { + feeTransferInvocation = utils.HeapPtr(adaptVMFunctionInvocation(trace.FeeTransferInvocation)) + } + + var constructorInvocation *FunctionInvocation + var executeInvocation *ExecuteInvocation + var functionInvocation *FunctionInvocation + + switch trace.Type { + case vm.TxnDeployAccount, vm.TxnDeploy: + if trace.ConstructorInvocation != nil { + constructorInvocation = utils.HeapPtr(adaptVMFunctionInvocation(trace.ConstructorInvocation)) + } + case vm.TxnInvoke: + if trace.ExecuteInvocation != nil { + executeInvocation = utils.HeapPtr(adaptVMExecuteInvocation(trace.ExecuteInvocation)) + } + case vm.TxnL1Handler: + if trace.FunctionInvocation != nil { + functionInvocation = utils.HeapPtr(adaptVMFunctionInvocation(trace.FunctionInvocation)) + } + } + + var resources *ExecutionResources + if trace.ExecutionResources != nil { + resources = utils.HeapPtr(adaptVMExecutionResources(trace.ExecutionResources)) + } + + var stateDiff *rpcv6.StateDiff + if trace.StateDiff != nil { + stateDiff = utils.HeapPtr(rpcv6.AdaptVMStateDiff(trace.StateDiff)) + } + + return TransactionTrace{ + Type: TransactionType(trace.Type), + ValidateInvocation: validateInvocation, + ExecuteInvocation: executeInvocation, + FeeTransferInvocation: feeTransferInvocation, + ConstructorInvocation: constructorInvocation, + FunctionInvocation: functionInvocation, + StateDiff: stateDiff, + ExecutionResources: resources, + } +} + +func adaptVMExecuteInvocation(vmFnInvocation *vm.ExecuteInvocation) ExecuteInvocation { + var functionInvocation *FunctionInvocation + if vmFnInvocation.FunctionInvocation != nil { + functionInvocation = utils.HeapPtr(adaptVMFunctionInvocation(vmFnInvocation.FunctionInvocation)) + } + + return ExecuteInvocation{ + RevertReason: vmFnInvocation.RevertReason, + FunctionInvocation: functionInvocation, + } +} + +func adaptVMFunctionInvocation(vmFnInvocation *vm.FunctionInvocation) FunctionInvocation { + // Adapt inner calls + adaptedCalls := make([]FunctionInvocation, len(vmFnInvocation.Calls)) + for index := range vmFnInvocation.Calls { + adaptedCalls[index] = adaptVMFunctionInvocation(&vmFnInvocation.Calls[index]) + } + + // Adapt events + adaptedEvents := make([]rpcv6.OrderedEvent, len(vmFnInvocation.Events)) + for index := range vmFnInvocation.Events { + vmEvent := &vmFnInvocation.Events[index] + + adaptedEvents[index] = rpcv6.OrderedEvent{ + Order: vmEvent.Order, + Keys: vmEvent.Keys, + Data: vmEvent.Data, + } + } + + // Adapt messages + adaptedMessages := make([]rpcv6.OrderedL2toL1Message, len(vmFnInvocation.Messages)) + for index := range vmFnInvocation.Messages { + vmMessage := &vmFnInvocation.Messages[index] + + toAddr, _ := new(felt.Felt).SetString(vmMessage.To) + + adaptedMessages[index] = rpcv6.OrderedL2toL1Message{ + Order: vmMessage.Order, + From: vmMessage.From, + To: toAddr, + Payload: vmMessage.Payload, + } + } + + // Adapt execution resources + var adaptedResources *InnerExecutionResources + if r := vmFnInvocation.ExecutionResources; r != nil { + adaptedResources = &InnerExecutionResources{ + L1Gas: r.L1Gas, + L2Gas: r.L2Gas, + } + } + + return FunctionInvocation{ + ContractAddress: vmFnInvocation.ContractAddress, + EntryPointSelector: vmFnInvocation.EntryPointSelector, + Calldata: vmFnInvocation.Calldata, + CallerAddress: vmFnInvocation.CallerAddress, + ClassHash: vmFnInvocation.ClassHash, + EntryPointType: vmFnInvocation.EntryPointType, + CallType: vmFnInvocation.CallType, + Result: vmFnInvocation.Result, + Calls: adaptedCalls, + Events: adaptedEvents, + Messages: adaptedMessages, + ExecutionResources: adaptedResources, + IsReverted: vmFnInvocation.IsReverted, + } +} + +func adaptVMExecutionResources(r *vm.ExecutionResources) ExecutionResources { + return ExecutionResources{ + InnerExecutionResources: InnerExecutionResources{ + L1Gas: r.L1Gas, + L2Gas: r.L2Gas, + }, + L1DataGas: r.L1DataGas, + } +} + +/**************************************************** + Feeder Adapters +*****************************************************/ + +func AdaptFeederBlockTrace(block *BlockWithTxs, blockTrace *starknet.BlockTrace) ([]TracedBlockTransaction, error) { + if blockTrace == nil { + return nil, nil + } + + if len(block.Transactions) != len(blockTrace.Traces) { + return nil, errors.New("mismatched number of txs and traces") + } + + // Adapt every feeder block trace to rpc v8 trace + adaptedTraces := make([]TracedBlockTransaction, len(blockTrace.Traces)) + for index := range blockTrace.Traces { + feederTrace := &blockTrace.Traces[index] + + trace := TransactionTrace{ + Type: block.Transactions[index].Type, + } + + if feederTrace.FeeTransferInvocation != nil && trace.Type != TxnL1Handler { + trace.FeeTransferInvocation = utils.HeapPtr(adaptFeederFunctionInvocation(feederTrace.FeeTransferInvocation)) + } + + if feederTrace.ValidateInvocation != nil && trace.Type != TxnL1Handler { + trace.ValidateInvocation = utils.HeapPtr(adaptFeederFunctionInvocation(feederTrace.ValidateInvocation)) + } + + var fnInvocation *FunctionInvocation + if fct := feederTrace.FunctionInvocation; fct != nil { + fnInvocation = utils.HeapPtr(adaptFeederFunctionInvocation(fct)) + } + + switch trace.Type { + case TxnDeploy, TxnDeployAccount: + trace.ConstructorInvocation = fnInvocation + case TxnInvoke: + trace.ExecuteInvocation = new(ExecuteInvocation) + if feederTrace.RevertError != "" { + trace.ExecuteInvocation.RevertReason = feederTrace.RevertError + } else { + trace.ExecuteInvocation.FunctionInvocation = fnInvocation + } + case TxnL1Handler: + trace.FunctionInvocation = fnInvocation + } + + adaptedTraces[index] = TracedBlockTransaction{ + TransactionHash: &feederTrace.TransactionHash, + TraceRoot: &trace, + } + } + + return adaptedTraces, nil +} + +func adaptFeederFunctionInvocation(snFnInvocation *starknet.FunctionInvocation) FunctionInvocation { + // Adapt inner calls + adaptedCalls := make([]FunctionInvocation, len(snFnInvocation.InternalCalls)) + for index := range snFnInvocation.InternalCalls { + adaptedCalls[index] = adaptFeederFunctionInvocation(&snFnInvocation.InternalCalls[index]) + } + + // Adapt events + adaptedEvents := make([]rpcv6.OrderedEvent, len(snFnInvocation.Events)) + for index := range snFnInvocation.Events { + snEvent := &snFnInvocation.Events[index] + + adaptedEvents[index] = rpcv6.OrderedEvent{ + Order: snEvent.Order, + Keys: utils.Map(snEvent.Keys, utils.HeapPtr[felt.Felt]), + Data: utils.Map(snEvent.Data, utils.HeapPtr[felt.Felt]), + } + } + + // Adapt messages + adaptedMessages := make([]rpcv6.OrderedL2toL1Message, len(snFnInvocation.Messages)) + for index := range snFnInvocation.Messages { + snMessage := &snFnInvocation.Messages[index] + + toAddr, _ := new(felt.Felt).SetString(snMessage.ToAddr) + + adaptedMessages[index] = rpcv6.OrderedL2toL1Message{ + Order: snMessage.Order, + From: &snFnInvocation.ContractAddress, + To: toAddr, + Payload: utils.Map(snMessage.Payload, utils.HeapPtr[felt.Felt]), + } + } + + return FunctionInvocation{ + ContractAddress: snFnInvocation.ContractAddress, + EntryPointSelector: snFnInvocation.Selector, + Calldata: snFnInvocation.Calldata, + CallerAddress: snFnInvocation.CallerAddress, + ClassHash: snFnInvocation.ClassHash, + EntryPointType: snFnInvocation.EntryPointType, + CallType: snFnInvocation.CallType, + Result: snFnInvocation.Result, + Calls: adaptedCalls, + Events: adaptedEvents, + Messages: adaptedMessages, + ExecutionResources: utils.HeapPtr(adaptFeederExecutionResources(&snFnInvocation.ExecutionResources)), + IsReverted: snFnInvocation.Failed, + } +} + +func adaptFeederExecutionResources(resources *starknet.ExecutionResources) InnerExecutionResources { + var l1Gas, l2Gas uint64 + if tgs := resources.TotalGasConsumed; tgs != nil { + l1Gas = tgs.L1Gas + l2Gas = tgs.L2Gas + } + + return InnerExecutionResources{ + L1Gas: l1Gas, + L2Gas: l2Gas, + } +} diff --git a/rpc/v8/simulation.go b/rpc/v8/simulation.go index 2b6b4df50f..70a360baae 100644 --- a/rpc/v8/simulation.go +++ b/rpc/v8/simulation.go @@ -39,13 +39,13 @@ func (s *SimulationFlag) UnmarshalJSON(bytes []byte) (err error) { } type SimulatedTransaction struct { - TransactionTrace *vm.TransactionTrace `json:"transaction_trace,omitempty"` - FeeEstimation FeeEstimate `json:"fee_estimation,omitempty"` + TransactionTrace *TransactionTrace `json:"transaction_trace,omitempty"` + FeeEstimation FeeEstimate `json:"fee_estimation,omitempty"` } type TracedBlockTransaction struct { - TraceRoot *vm.TransactionTrace `json:"trace_root,omitempty"` - TransactionHash *felt.Felt `json:"transaction_hash,omitempty"` + TraceRoot *TransactionTrace `json:"trace_root,omitempty"` + TransactionHash *felt.Felt `json:"transaction_hash,omitempty"` } /**************************************************** @@ -112,7 +112,7 @@ func (h *Handler) simulateTransactions(id BlockID, transactions []BroadcastedTra func prepareTransactions(transactions []BroadcastedTransaction, network *utils.Network) ( []core.Transaction, []core.Class, []*felt.Felt, *jsonrpc.Error, ) { - txns := make([]core.Transaction, 0, len(transactions)) + txns := make([]core.Transaction, len(transactions)) var classes []core.Class paidFeesOnL1 := make([]*felt.Felt, 0) @@ -126,7 +126,7 @@ func prepareTransactions(transactions []BroadcastedTransaction, network *utils.N paidFeesOnL1 = append(paidFeesOnL1, paidFeeOnL1) } - txns = append(txns, txn) + txns[idx] = txn if declaredClass != nil { classes = append(classes, declaredClass) } @@ -153,6 +153,7 @@ func createSimulatedTransactions( traces := executionResults.Traces gasConsumed := executionResults.GasConsumed daGas := executionResults.DataAvailability + if len(overallFees) != len(traces) || len(overallFees) != len(gasConsumed) || len(overallFees) != len(daGas) || len(overallFees) != len(txns) { return nil, fmt.Errorf("inconsistent lengths: %d overall fees, %d traces, %d gas consumed, %d data availability, %d txns", @@ -177,18 +178,19 @@ func createSimulatedTransactions( simulatedTransactions := make([]SimulatedTransaction, len(overallFees)) for i, overallFee := range overallFees { - trace := traces[i] - traces[i].ExecutionResources = &vm.ExecutionResources{ - L1Gas: gasConsumed[i].L1Gas, - L1DataGas: gasConsumed[i].L1DataGas, - L2Gas: gasConsumed[i].L2Gas, - ComputationResources: trace.TotalComputationResources(), - DataAvailability: &vm.DataAvailability{ - L1Gas: daGas[i].L1Gas, - L1DataGas: daGas[i].L1DataGas, + // Adapt transaction trace to rpc v8 trace + trace := utils.HeapPtr(AdaptVMTransactionTrace(&traces[i])) + + // Add root level execution resources + trace.ExecutionResources = &ExecutionResources{ + InnerExecutionResources: InnerExecutionResources{ + L1Gas: gasConsumed[i].L1Gas, + L2Gas: gasConsumed[i].L2Gas, }, + L1DataGas: gasConsumed[i].L1DataGas, } + // Compute data for FeeEstimate var l1GasPrice, l2GasPrice, l1DataGasPrice *felt.Felt feeUnit := feeUnit(txns[i]) switch feeUnit { @@ -202,8 +204,9 @@ func createSimulatedTransactions( l1DataGasPrice = l1DataGasPriceStrk } + // Append simulated transaction (trace + fee estimate) simulatedTransactions[i] = SimulatedTransaction{ - TransactionTrace: &traces[i], + TransactionTrace: trace, FeeEstimation: FeeEstimate{ L1GasConsumed: new(felt.Felt).SetUint64(gasConsumed[i].L1Gas), L1GasPrice: l1GasPrice, diff --git a/rpc/v8/simulation_pkg_test.go b/rpc/v8/simulation_pkg_test.go index e66ff1b9fe..5de7b08e81 100644 --- a/rpc/v8/simulation_pkg_test.go +++ b/rpc/v8/simulation_pkg_test.go @@ -29,6 +29,7 @@ func TestCreateSimulatedTransactions(t *testing.T) { Traces: []vm.TransactionTrace{{}, {}}, NumSteps: 0, } + txns := []core.Transaction{ &core.InvokeTransaction{ Version: new(core.TransactionVersion).SetUint64(1), @@ -37,6 +38,7 @@ func TestCreateSimulatedTransactions(t *testing.T) { Version: new(core.TransactionVersion).SetUint64(3), }, } + header := &core.Header{ L1GasPriceETH: new(felt.Felt).SetUint64(1), L1GasPriceSTRK: new(felt.Felt).SetUint64(2), @@ -56,15 +58,13 @@ func TestCreateSimulatedTransactions(t *testing.T) { require.Len(t, simTxs, 2) expected := []SimulatedTransaction{ { - TransactionTrace: &vm.TransactionTrace{ - ExecutionResources: &vm.ExecutionResources{ - L1Gas: 100, - L1DataGas: 50, - L2Gas: 200, - DataAvailability: &vm.DataAvailability{ - L1Gas: 5, - L1DataGas: 2, + TransactionTrace: &TransactionTrace{ + ExecutionResources: &ExecutionResources{ + InnerExecutionResources: InnerExecutionResources{ + L1Gas: 100, + L2Gas: 200, }, + L1DataGas: 50, }, }, FeeEstimation: FeeEstimate{ @@ -79,15 +79,13 @@ func TestCreateSimulatedTransactions(t *testing.T) { }, }, { - TransactionTrace: &vm.TransactionTrace{ - ExecutionResources: &vm.ExecutionResources{ - L1Gas: 150, - L1DataGas: 70, - L2Gas: 250, - DataAvailability: &vm.DataAvailability{ - L1Gas: 6, - L1DataGas: 3, + TransactionTrace: &TransactionTrace{ + ExecutionResources: &ExecutionResources{ + InnerExecutionResources: InnerExecutionResources{ + L1Gas: 150, + L2Gas: 250, }, + L1DataGas: 70, }, }, FeeEstimation: FeeEstimate{ diff --git a/rpc/v8/trace.go b/rpc/v8/trace.go index e10f8fee5f..28c47bf169 100644 --- a/rpc/v8/trace.go +++ b/rpc/v8/trace.go @@ -15,7 +15,7 @@ import ( "github.com/NethermindEth/juno/db" "github.com/NethermindEth/juno/jsonrpc" "github.com/NethermindEth/juno/rpc/rpccore" - "github.com/NethermindEth/juno/starknet" + rpcv6 "github.com/NethermindEth/juno/rpc/v6" "github.com/NethermindEth/juno/sync" "github.com/NethermindEth/juno/utils" "github.com/NethermindEth/juno/vm" @@ -25,106 +25,44 @@ var traceFallbackVersion = semver.MustParse("0.13.1") const excludedVersion = "0.13.1.1" -func adaptBlockTrace(block *BlockWithTxs, blockTrace *starknet.BlockTrace) ([]TracedBlockTransaction, error) { - if blockTrace == nil { - return nil, nil - } - if len(block.Transactions) != len(blockTrace.Traces) { - return nil, errors.New("mismatched number of txs and traces") - } - traces := make([]TracedBlockTransaction, 0, len(blockTrace.Traces)) - for index := range blockTrace.Traces { - feederTrace := &blockTrace.Traces[index] - trace := vm.TransactionTrace{} - trace.Type = vm.TransactionType(block.Transactions[index].Type) - - trace.FeeTransferInvocation = adaptFunctionInvocation(feederTrace.FeeTransferInvocation) - trace.ValidateInvocation = adaptFunctionInvocation(feederTrace.ValidateInvocation) - - fnInvocation := adaptFunctionInvocation(feederTrace.FunctionInvocation) - switch block.Transactions[index].Type { - case TxnDeploy: - trace.ConstructorInvocation = fnInvocation - case TxnDeployAccount: - trace.ConstructorInvocation = fnInvocation - case TxnInvoke: - trace.ExecuteInvocation = new(vm.ExecuteInvocation) - if feederTrace.RevertError != "" { - trace.ExecuteInvocation.RevertReason = feederTrace.RevertError - } else { - trace.ExecuteInvocation.FunctionInvocation = fnInvocation - } - case TxnL1Handler: - trace.FunctionInvocation = fnInvocation - } - - traces = append(traces, TracedBlockTransaction{ - TransactionHash: &feederTrace.TransactionHash, - TraceRoot: &trace, - }) - } - return traces, nil +type TransactionTrace struct { + Type TransactionType `json:"type"` + ValidateInvocation *FunctionInvocation `json:"validate_invocation,omitempty"` + ExecuteInvocation *ExecuteInvocation `json:"execute_invocation,omitempty" validate:"required_if=Type INVOKE"` + FeeTransferInvocation *FunctionInvocation `json:"fee_transfer_invocation,omitempty"` + ConstructorInvocation *FunctionInvocation `json:"constructor_invocation,omitempty" validate:"required_if=Type DEPLOY_ACCOUNT"` + FunctionInvocation *FunctionInvocation `json:"function_invocation,omitempty" validate:"required_if=Type L1_HANDLER"` + StateDiff *rpcv6.StateDiff `json:"state_diff,omitempty"` + ExecutionResources *ExecutionResources `json:"execution_resources"` } -func adaptFunctionInvocation(snFnInvocation *starknet.FunctionInvocation) *vm.FunctionInvocation { - if snFnInvocation == nil { - return nil - } - - fnInvocation := vm.FunctionInvocation{ - ContractAddress: snFnInvocation.ContractAddress, - EntryPointSelector: snFnInvocation.Selector, - Calldata: snFnInvocation.Calldata, - CallerAddress: snFnInvocation.CallerAddress, - ClassHash: snFnInvocation.ClassHash, - EntryPointType: snFnInvocation.EntryPointType, - CallType: snFnInvocation.CallType, - Result: snFnInvocation.Result, - Calls: make([]vm.FunctionInvocation, 0, len(snFnInvocation.InternalCalls)), - Events: make([]vm.OrderedEvent, 0, len(snFnInvocation.Events)), - Messages: make([]vm.OrderedL2toL1Message, 0, len(snFnInvocation.Messages)), - ExecutionResources: adaptFeederExecutionResources(&snFnInvocation.ExecutionResources), - } +type ExecuteInvocation struct { + RevertReason string `json:"revert_reason"` + *FunctionInvocation `json:",omitempty"` +} - for index := range snFnInvocation.InternalCalls { - fnInvocation.Calls = append(fnInvocation.Calls, *adaptFunctionInvocation(&snFnInvocation.InternalCalls[index])) - } - for index := range snFnInvocation.Events { - snEvent := &snFnInvocation.Events[index] - fnInvocation.Events = append(fnInvocation.Events, vm.OrderedEvent{ - Order: snEvent.Order, - Keys: utils.Map(snEvent.Keys, utils.HeapPtr[felt.Felt]), - Data: utils.Map(snEvent.Data, utils.HeapPtr[felt.Felt]), - }) +func (e ExecuteInvocation) MarshalJSON() ([]byte, error) { + if e.FunctionInvocation != nil { + return json.Marshal(e.FunctionInvocation) } - for index := range snFnInvocation.Messages { - snMessage := &snFnInvocation.Messages[index] - fnInvocation.Messages = append(fnInvocation.Messages, vm.OrderedL2toL1Message{ - Order: snMessage.Order, - Payload: utils.Map(snMessage.Payload, utils.HeapPtr[felt.Felt]), - To: snMessage.ToAddr, - }) - } - - return &fnInvocation + type alias ExecuteInvocation + return json.Marshal(alias(e)) } -func adaptFeederExecutionResources(resources *starknet.ExecutionResources) *vm.ExecutionResources { - builtins := &resources.BuiltinInstanceCounter - return &vm.ExecutionResources{ - ComputationResources: vm.ComputationResources{ - Steps: resources.Steps, - MemoryHoles: resources.MemoryHoles, - Pedersen: builtins.Pedersen, - RangeCheck: builtins.RangeCheck, - Bitwise: builtins.Bitwise, - Ecdsa: builtins.Ecsda, - EcOp: builtins.EcOp, - Keccak: builtins.Keccak, - Poseidon: builtins.Poseidon, - SegmentArena: builtins.SegmentArena, - }, - } +type FunctionInvocation struct { + ContractAddress felt.Felt `json:"contract_address"` + EntryPointSelector *felt.Felt `json:"entry_point_selector"` + Calldata []felt.Felt `json:"calldata"` + CallerAddress felt.Felt `json:"caller_address"` + ClassHash *felt.Felt `json:"class_hash"` + EntryPointType string `json:"entry_point_type"` // shouldnt we put it as enum here ? + CallType string `json:"call_type"` // shouldnt we put it as enum here ? + Result []felt.Felt `json:"result"` + Calls []FunctionInvocation `json:"calls"` + Events []rpcv6.OrderedEvent `json:"events"` + Messages []rpcv6.OrderedL2toL1Message `json:"messages"` + ExecutionResources *InnerExecutionResources `json:"execution_resources"` + IsReverted bool `json:"is_reverted"` } /**************************************************** @@ -135,12 +73,8 @@ func adaptFeederExecutionResources(resources *starknet.ExecutionResources) *vm.E // // It follows the specification defined here: // https://github.com/starkware-libs/starknet-specs/blob/1ae810e0137cc5d175ace4554892a4f43052be56/api/starknet_trace_api_openrpc.json#L11 -func (h *Handler) TraceTransaction(ctx context.Context, hash felt.Felt) (*vm.TransactionTrace, http.Header, *jsonrpc.Error) { - return h.traceTransaction(ctx, &hash) -} - -func (h *Handler) traceTransaction(ctx context.Context, hash *felt.Felt) (*vm.TransactionTrace, http.Header, *jsonrpc.Error) { - _, blockHash, _, err := h.bcReader.Receipt(hash) +func (h *Handler) TraceTransaction(ctx context.Context, hash felt.Felt) (*TransactionTrace, http.Header, *jsonrpc.Error) { + _, blockHash, _, err := h.bcReader.Receipt(&hash) httpHeader := http.Header{} httpHeader.Set(ExecutionStepsHeader, "0") @@ -167,7 +101,7 @@ func (h *Handler) traceTransaction(ctx context.Context, hash *felt.Felt) (*vm.Tr } txIndex := slices.IndexFunc(block.Transactions, func(tx core.Transaction) bool { - return tx.Hash().Equal(hash) + return tx.Hash().Equal(&hash) }) if txIndex == -1 { return nil, httpHeader, rpccore.ErrTxnHashNotFound @@ -208,19 +142,13 @@ func (h *Handler) traceBlockTransactions(ctx context.Context, block *core.Block) return nil, httpHeader, err } - txDataAvailability := make(map[felt.Felt]vm.DataAvailability, len(block.Receipts)) + // fgw doesn't provide this data in traces endpoint. So, we get it from our block receipts txTotalGasConsumed := make(map[felt.Felt]core.GasConsumed, len(block.Receipts)) for _, receipt := range block.Receipts { if receipt.ExecutionResources == nil { continue } - if receiptDA := receipt.ExecutionResources.DataAvailability; receiptDA != nil { - da := vm.DataAvailability{ - L1Gas: receiptDA.L1Gas, - L1DataGas: receiptDA.L1DataGas, - } - txDataAvailability[*receipt.TransactionHash] = da - } + if receiptTGS := receipt.ExecutionResources.TotalGasConsumed; receiptTGS != nil { tgs := core.GasConsumed{ L1Gas: receiptTGS.L1Gas, @@ -231,18 +159,16 @@ func (h *Handler) traceBlockTransactions(ctx context.Context, block *core.Block) } } - // add execution resources on root level + // For every trace in block, add execution resources on root level for index, trace := range result { - // fgw doesn't provide this data in traces endpoint - // some receipts don't have data availability data in this case we don't - da := txDataAvailability[*trace.TransactionHash] tgs := txTotalGasConsumed[*trace.TransactionHash] - result[index].TraceRoot.ExecutionResources = &vm.ExecutionResources{ - L1Gas: tgs.L1Gas, - L1DataGas: tgs.L1DataGas, - L2Gas: tgs.L2Gas, - ComputationResources: trace.TraceRoot.TotalComputationResources(), - DataAvailability: &da, + + result[index].TraceRoot.ExecutionResources = &ExecutionResources{ + InnerExecutionResources: InnerExecutionResources{ + L1Gas: tgs.L1Gas, + L2Gas: tgs.L2Gas, + }, + L1DataGas: tgs.L1DataGas, } } @@ -318,22 +244,23 @@ func (h *Handler) traceBlockTransactions(ctx context.Context, block *core.Block) return nil, httpHeader, rpccore.ErrUnexpectedError.CloneWithData(err.Error()) } - result := make([]TracedBlockTransaction, 0, len(executionResult.Traces)) - for index, trace := range executionResult.Traces { - executionResult.Traces[index].ExecutionResources = &vm.ExecutionResources{ - L1Gas: executionResult.GasConsumed[index].L1Gas, - L1DataGas: executionResult.GasConsumed[index].L1DataGas, - L2Gas: executionResult.GasConsumed[index].L2Gas, - ComputationResources: trace.TotalComputationResources(), - DataAvailability: &vm.DataAvailability{ - L1Gas: executionResult.DataAvailability[index].L1Gas, - L1DataGas: executionResult.DataAvailability[index].L1DataGas, + result := make([]TracedBlockTransaction, len(executionResult.Traces)) + // Adapt every vm transaction trace to rpc v8 trace and add root level execution resources + for index := range executionResult.Traces { + trace := utils.HeapPtr(AdaptVMTransactionTrace(&executionResult.Traces[index])) + + trace.ExecutionResources = &ExecutionResources{ + InnerExecutionResources: InnerExecutionResources{ + L1Gas: executionResult.GasConsumed[index].L1Gas, + L2Gas: executionResult.GasConsumed[index].L2Gas, }, + L1DataGas: executionResult.GasConsumed[index].L1DataGas, } - result = append(result, TracedBlockTransaction{ - TraceRoot: &executionResult.Traces[index], + + result[index] = TracedBlockTransaction{ + TraceRoot: trace, TransactionHash: block.Transactions[index].Hash(), - }) + } } if !isPending { @@ -362,7 +289,7 @@ func (h *Handler) fetchTraces(ctx context.Context, blockHash *felt.Felt) ([]Trac return nil, rpccore.ErrUnexpectedError.CloneWithData(fErr.Error()) } - traces, aErr := adaptBlockTrace(rpcBlock, blockTrace) + traces, aErr := AdaptFeederBlockTrace(rpcBlock, blockTrace) if aErr != nil { return nil, rpccore.ErrUnexpectedError.CloneWithData(aErr.Error()) } diff --git a/rpc/v8/trace_test.go b/rpc/v8/trace_test.go index 4633cd06d8..a8bc47f2e2 100644 --- a/rpc/v8/trace_test.go +++ b/rpc/v8/trace_test.go @@ -15,63 +15,231 @@ import ( "github.com/NethermindEth/juno/db/pebble" "github.com/NethermindEth/juno/mocks" "github.com/NethermindEth/juno/rpc/rpccore" + rpcv6 "github.com/NethermindEth/juno/rpc/v6" rpc "github.com/NethermindEth/juno/rpc/v8" + "github.com/NethermindEth/juno/starknet" adaptfeeder "github.com/NethermindEth/juno/starknetdata/feeder" "github.com/NethermindEth/juno/sync" "github.com/NethermindEth/juno/utils" + "github.com/NethermindEth/juno/validator" "github.com/NethermindEth/juno/vm" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.uber.org/mock/gomock" ) +type expectedBlockTrace struct { + blockHash string + blockNumber uint64 + wantTrace string +} + func TestTraceFallback(t *testing.T) { + t.Run("Goerli Integration", func(t *testing.T) { + tests := map[string]expectedBlockTrace{ + "old block": { + blockHash: "0x3ae41b0f023e53151b0c8ab8b9caafb7005d5f41c9ab260276d5bdc49726279", + blockNumber: 0, + wantTrace: `[ { "trace_root": { "type": "DEPLOY", "constructor_invocation": { "contract_address": "0x7b196a359045d4d0c10f73bdf244a9e1205a615dbb754b8df40173364288534", "entry_point_selector": null, "calldata": [ "0x187d50a5cf3ebd6d4d6fa8e29e4cad0a237759c6416304a25c4ea792ed4bba4", "0x42f5af30d6693674296ad87301935d0c159036c3b24af4042ff0270913bf6c6" ], "caller_address": "0x0", "class_hash": null, "entry_point_type": "", "call_type": "", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false }, "execution_resources": { "l1_gas": 5, "l2_gas": 10, "l1_data_gas": 15 } }, "transaction_hash": "0x3fa1bff0c86f34b2eb32c26d12208b6bdb4a5f6a434ac1d4f0e2d1db71bd711" }, { "trace_root": { "type": "DEPLOY", "constructor_invocation": { "contract_address": "0x64ed79a8ebe97485d3357bbfdf5f6bea0d9db3b5f1feb6e80d564a179122dc6", "entry_point_selector": null, "calldata": [ "0x5cedec15acd969b0fba39fec9e7d9bd4d0b33f100969ad3a4543039a6f696d4", "0xce9801d27b02543f4d88b60aa456860f94ee9f612fc56464abfbdeedc1ab72" ], "caller_address": "0x0", "class_hash": null, "entry_point_type": "", "call_type": "", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false }, "execution_resources": { "l1_gas": 5, "l2_gas": 10, "l1_data_gas": 15 } }, "transaction_hash": "0x154c02cc3165cceadaa32e7238a67061b3a1eac414138c4ebe1408f37fd93eb" }, { "trace_root": { "type": "INVOKE", "execute_invocation": { "contract_address": "0x64ed79a8ebe97485d3357bbfdf5f6bea0d9db3b5f1feb6e80d564a179122dc6", "entry_point_selector": null, "calldata": [ "0x17d9c35a8b9a0d4512fa05eafec01c2758a7a5b7ec7b47408a24a4b33124d9b", "0x2", "0x7f800b5bf79637f8f83f47a8fc4d368b43695c781b22a899f11b5f2faba874a", "0x3a7a40d383612b0ad167aec8d90fb07e576e017d07948f63ac318b52511ae93" ], "caller_address": "0x0", "class_hash": null, "entry_point_type": "", "call_type": "", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false }, "execution_resources": { "l1_gas": 5, "l2_gas": 10, "l1_data_gas": 15 } }, "transaction_hash": "0x7893675c16da857b7c4229cda449e08a4fe13b07ca817e79d1db02e8a046047" }, { "trace_root": { "type": "INVOKE", "execute_invocation": { "contract_address": "0x64ed79a8ebe97485d3357bbfdf5f6bea0d9db3b5f1feb6e80d564a179122dc6", "entry_point_selector": null, "calldata": [ "0x17d9c35a8b9a0d4512fa05eafec01c2758a7a5b7ec7b47408a24a4b33124d9b", "0x2", "0x7f800b5bf79637f8f83f47a8fc4d368b43695c781b22a899f11b5f2faba874a", "0xf140b304e9266c72f1054116dd06d9c1c8e981db7bf34e3c6da99640e9a7c8" ], "caller_address": "0x0", "class_hash": null, "entry_point_type": "", "call_type": "", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false }, "execution_resources": { "l1_gas": 5, "l2_gas": 10, "l1_data_gas": 15 } }, "transaction_hash": "0x4a277d67e3f42c4a343854081d1e2e9e425f1323255e4486d2badb37a1d8630" } ]`, + }, + // The newer block still needs to have starknet_version <= 0.13.1 to be fetched from the feeder + "newer block": { + blockHash: "0xe3828bd9154ab385e2cbb95b3b650365fb3c6a4321660d98ce8b0a9194f9a3", + blockNumber: 300000, + wantTrace: `[ { "trace_root": { "type": "INVOKE", "validate_invocation": { "contract_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", "calldata": [ "0x1", "0x332299dc083f3778122e5b7762bc9d399da18fefe93769aee67bb49f51c8d2", "0x2d7cf5d5a324a320f9f37804b1615a533fde487400b41af80f13f7ac5581325", "0x0", "0x4", "0x4", "0xaf35ee8ed700ff132c5d1d298a73becda25ccdf9", "0x2", "0x6cd852fe1b2bbd8587bb0aaeb09813436c57c8ce21e75651e317273a1f22228", "0x58feb991988e53fffcba71f6df23c803fb062f1b3bab126d2c9ce574255b36e" ], "caller_address": "0x0", "class_hash": "0x646a72e2aab2fca75d713fbe4a58f2d12cbd64105621b89dc9ce7045b5bf02b", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false }, "execute_invocation": { "contract_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", "calldata": [ "0x1", "0x332299dc083f3778122e5b7762bc9d399da18fefe93769aee67bb49f51c8d2", "0x2d7cf5d5a324a320f9f37804b1615a533fde487400b41af80f13f7ac5581325", "0x0", "0x4", "0x4", "0xaf35ee8ed700ff132c5d1d298a73becda25ccdf9", "0x2", "0x6cd852fe1b2bbd8587bb0aaeb09813436c57c8ce21e75651e317273a1f22228", "0x58feb991988e53fffcba71f6df23c803fb062f1b3bab126d2c9ce574255b36e" ], "caller_address": "0x0", "class_hash": "0x646a72e2aab2fca75d713fbe4a58f2d12cbd64105621b89dc9ce7045b5bf02b", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [ { "contract_address": "0x332299dc083f3778122e5b7762bc9d399da18fefe93769aee67bb49f51c8d2", "entry_point_selector": "0x2d7cf5d5a324a320f9f37804b1615a533fde487400b41af80f13f7ac5581325", "calldata": [ "0xaf35ee8ed700ff132c5d1d298a73becda25ccdf9", "0x2", "0x6cd852fe1b2bbd8587bb0aaeb09813436c57c8ce21e75651e317273a1f22228", "0x58feb991988e53fffcba71f6df23c803fb062f1b3bab126d2c9ce574255b36e" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0x165e7db96ab97a63c621229617a6d49633737238673477a54720e4c952f2c7e", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [ { "order": 0, "from_address": "0x332299dc083f3778122e5b7762bc9d399da18fefe93769aee67bb49f51c8d2", "to_address": "0xaf35ee8ed700ff132c5d1d298a73becda25ccdf9", "payload": [ "0x6cd852fe1b2bbd8587bb0aaeb09813436c57c8ce21e75651e317273a1f22228", "0x58feb991988e53fffcba71f6df23c803fb062f1b3bab126d2c9ce574255b36e" ] } ], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false } ], "events": [], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false }, "fee_transfer_invocation": { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x127089df3a1984", "0x0" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0xd0e183745e9dae3e4e78a8ffedcce0903fc4900beace4e0abf192d4c202da3", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x1" ], "calls": [ { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x127089df3a1984", "0x0" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0x28d7d394810ad8c52741ad8f7564717fd02c10ced68657a81d0b6710ce22079", "entry_point_type": "EXTERNAL", "call_type": "DELEGATE", "result": [ "0x1" ], "calls": [], "events": [], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false } ], "events": [], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false }, "execution_resources": { "l1_gas": 5, "l2_gas": 10, "l1_data_gas": 15 } }, "transaction_hash": "0x2a648ab1aa6847eb38507fc842e050f256562bf87b26083c332f3f21318c2c3" }, { "trace_root": { "type": "INVOKE", "validate_invocation": { "contract_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", "calldata": [ "0x1", "0x5f9211b05c9609d54a8bf5f9cfa4e2cd5a3cab3b5d79682c585575495a15dd1", "0x317eb442b72a9fae758d4fb26830ed0d9f31c8e7da4dbff4e8c59ea6a158e7f", "0x0", "0x4", "0x4", "0x447379c077035ef4f442411d0407ce9aa66c558f0060137f6455f4f230eabeb", "0x2", "0x6811b7755a7dd0ec1fb6f51a883e3f255368e2dfd497b5f6480c00cf9cd5a2e", "0x23b9e26720dd7aaf98c7cea56499f48f75dc1d4123f7e2d6c23bfc4d5f4a336" ], "caller_address": "0x0", "class_hash": "0x646a72e2aab2fca75d713fbe4a58f2d12cbd64105621b89dc9ce7045b5bf02b", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false }, "execute_invocation": { "contract_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", "calldata": [ "0x1", "0x5f9211b05c9609d54a8bf5f9cfa4e2cd5a3cab3b5d79682c585575495a15dd1", "0x317eb442b72a9fae758d4fb26830ed0d9f31c8e7da4dbff4e8c59ea6a158e7f", "0x0", "0x4", "0x4", "0x447379c077035ef4f442411d0407ce9aa66c558f0060137f6455f4f230eabeb", "0x2", "0x6811b7755a7dd0ec1fb6f51a883e3f255368e2dfd497b5f6480c00cf9cd5a2e", "0x23b9e26720dd7aaf98c7cea56499f48f75dc1d4123f7e2d6c23bfc4d5f4a336" ], "caller_address": "0x0", "class_hash": "0x646a72e2aab2fca75d713fbe4a58f2d12cbd64105621b89dc9ce7045b5bf02b", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [ { "contract_address": "0x5f9211b05c9609d54a8bf5f9cfa4e2cd5a3cab3b5d79682c585575495a15dd1", "entry_point_selector": "0x317eb442b72a9fae758d4fb26830ed0d9f31c8e7da4dbff4e8c59ea6a158e7f", "calldata": [ "0x447379c077035ef4f442411d0407ce9aa66c558f0060137f6455f4f230eabeb", "0x2", "0x6811b7755a7dd0ec1fb6f51a883e3f255368e2dfd497b5f6480c00cf9cd5a2e", "0x23b9e26720dd7aaf98c7cea56499f48f75dc1d4123f7e2d6c23bfc4d5f4a336" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0x13abfd2f333f9c69f690f1569140cdae25f6f66e3f371c9cbb998b65f664a85", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false } ], "events": [], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false }, "fee_transfer_invocation": { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x3b2d25cd7bccc", "0x0" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0xd0e183745e9dae3e4e78a8ffedcce0903fc4900beace4e0abf192d4c202da3", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x1" ], "calls": [ { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x3b2d25cd7bccc", "0x0" ], "caller_address": "0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7", "class_hash": "0x28d7d394810ad8c52741ad8f7564717fd02c10ced68657a81d0b6710ce22079", "entry_point_type": "EXTERNAL", "call_type": "DELEGATE", "result": [ "0x1" ], "calls": [], "events": [], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false } ], "events": [], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false }, "execution_resources": { "l1_gas": 5, "l2_gas": 10, "l1_data_gas": 15 } }, "transaction_hash": "0xbc984e8e1fe594dd518a3a51db4f338437a5d2fbdda772d4426b532a67ffff" } ]`, + }, + } + + AssertTracedBlockTransactions(t, &utils.Integration, tests) + }) + + t.Run("Sepolia", func(t *testing.T) { + tests := map[string]expectedBlockTrace{ + "old block": { + blockHash: "0x37644818236ee05b7e3b180bed64ea70ee3dd1553ca334a5c2a290ee276f380", + blockNumber: 3, + wantTrace: `[ { "trace_root": { "type": "INVOKE", "validate_invocation": { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", "calldata": [ "0x1", "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "0x0", "0x4", "0x4", "0x1b661756bf7d16210fc611626e1af4569baa1781ffc964bd018f4585ae241c1", "0x0", "0x0", "0x1" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false }, "execute_invocation": { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", "calldata": [ "0x1", "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "0x0", "0x4", "0x4", "0x1b661756bf7d16210fc611626e1af4569baa1781ffc964bd018f4585ae241c1", "0x0", "0x0", "0x1" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x23be95f90bf41685e18a4356e57b0cfdc1da22bf382ead8b64108353915c1e5" ], "calls": [ { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "calldata": [ "0x1b661756bf7d16210fc611626e1af4569baa1781ffc964bd018f4585ae241c1", "0x0", "0x0", "0x1" ], "caller_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x23be95f90bf41685e18a4356e57b0cfdc1da22bf382ead8b64108353915c1e5" ], "calls": [ { "contract_address": "0x23be95f90bf41685e18a4356e57b0cfdc1da22bf382ead8b64108353915c1e5", "entry_point_selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194", "calldata": [], "caller_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "class_hash": "0x1b661756bf7d16210fc611626e1af4569baa1781ffc964bd018f4585ae241c1", "entry_point_type": "CONSTRUCTOR", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false } ], "events": [], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false } ], "events": [], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false }, "execution_resources": { "l1_gas": 5, "l2_gas": 10, "l1_data_gas": 15 } }, "transaction_hash": "0x3f786ecc4955a2602c91a291328518ef866cb7f3d50e4b16fd42282952623aa" }, { "trace_root": { "type": "INVOKE", "validate_invocation": { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", "calldata": [ "0x1", "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "0x0", "0x4", "0x4", "0x4f23a756b221f8ce46b72e6a6b10ee7ee6cf3b59790e76e02433104f9a8c5d1", "0x0", "0x0", "0x1" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false }, "execute_invocation": { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", "calldata": [ "0x1", "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "0x0", "0x4", "0x4", "0x4f23a756b221f8ce46b72e6a6b10ee7ee6cf3b59790e76e02433104f9a8c5d1", "0x0", "0x0", "0x1" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x6d8ff7b212b08760c82e4a8f354f6ebc69d748290fa38e92eb859726a88f379" ], "calls": [ { "contract_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "entry_point_selector": "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", "calldata": [ "0x4f23a756b221f8ce46b72e6a6b10ee7ee6cf3b59790e76e02433104f9a8c5d1", "0x0", "0x0", "0x1" ], "caller_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x6d8ff7b212b08760c82e4a8f354f6ebc69d748290fa38e92eb859726a88f379" ], "calls": [ { "contract_address": "0x6d8ff7b212b08760c82e4a8f354f6ebc69d748290fa38e92eb859726a88f379", "entry_point_selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194", "calldata": [], "caller_address": "0x43abaa073c768ebf039c0c4f46db9acc39e9ec165690418060a652aab39e7d8", "class_hash": "0x4f23a756b221f8ce46b72e6a6b10ee7ee6cf3b59790e76e02433104f9a8c5d1", "entry_point_type": "CONSTRUCTOR", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false } ], "events": [], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false } ], "events": [], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false }, "execution_resources": { "l1_gas": 5, "l2_gas": 10, "l1_data_gas": 15 } }, "transaction_hash": "0x4010bd7b00e591c163729aa501691e89784c2afe77d71f7b27613e377738843" } ]`, + }, + // The newer block still needs to have starknet_version <= 0.13.1 to be fetched from the feeder + "newer block": { + blockHash: "0x733495d0744edd9785b400408fa87c8ad599f81859df544897f80a3fceab422", + blockNumber: 40000, + wantTrace: `[ { "trace_root": { "type": "INVOKE", "validate_invocation": { "contract_address": "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", "calldata": [ "0x2", "0x4d0b88ace5705bb7825f91ee95557d906600b7e7762f5615e6a4f407185a43a", "0x3d7905601c217734671143d457f0db37f7f8883112abd34b92c4abfeafde0c3", "0x2", "0x4e946d49fca553930846e35533342f88e59a841c24d9cf507ef28dd6b67cb9b", "0x3ea9c575cfdaa875f3fecaf7db4acdb536ee6b38b8d8a4c769c63d044f942dc", "0x6359ed638df79b82f2f9dbf92abbcb41b57f9dd91ead86b1c85d2dee192c", "0x1a8e87e9d2008fcd3ce423ae5219c21e49be18d05d72825feb7e2bb687ba35c", "0x2", "0x44cd44ad7abf35b9dbe1e17de3610d21", "0x9f806c191aa2a3d47f2b8efc4c412d2f" ], "caller_address": "0x0", "class_hash": "0x2338634f11772ea342365abd5be9d9dc8a6f44f159ad782fdebd3db5d969738", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x56414c4944" ], "calls": [], "events": [], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false }, "execute_invocation": { "contract_address": "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", "calldata": [ "0x2", "0x4d0b88ace5705bb7825f91ee95557d906600b7e7762f5615e6a4f407185a43a", "0x3d7905601c217734671143d457f0db37f7f8883112abd34b92c4abfeafde0c3", "0x2", "0x4e946d49fca553930846e35533342f88e59a841c24d9cf507ef28dd6b67cb9b", "0x3ea9c575cfdaa875f3fecaf7db4acdb536ee6b38b8d8a4c769c63d044f942dc", "0x6359ed638df79b82f2f9dbf92abbcb41b57f9dd91ead86b1c85d2dee192c", "0x1a8e87e9d2008fcd3ce423ae5219c21e49be18d05d72825feb7e2bb687ba35c", "0x2", "0x44cd44ad7abf35b9dbe1e17de3610d21", "0x9f806c191aa2a3d47f2b8efc4c412d2f" ], "caller_address": "0x0", "class_hash": "0x2338634f11772ea342365abd5be9d9dc8a6f44f159ad782fdebd3db5d969738", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x2", "0x0", "0x0" ], "calls": [ { "contract_address": "0x4d0b88ace5705bb7825f91ee95557d906600b7e7762f5615e6a4f407185a43a", "entry_point_selector": "0x3d7905601c217734671143d457f0db37f7f8883112abd34b92c4abfeafde0c3", "calldata": [ "0x4e946d49fca553930846e35533342f88e59a841c24d9cf507ef28dd6b67cb9b", "0x3ea9c575cfdaa875f3fecaf7db4acdb536ee6b38b8d8a4c769c63d044f942dc" ], "caller_address": "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "class_hash": "0x772164c9d6179a89e7f1167f099219f47d752304b16ed01f081b6e0b45c93c3", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false }, { "contract_address": "0x6359ed638df79b82f2f9dbf92abbcb41b57f9dd91ead86b1c85d2dee192c", "entry_point_selector": "0x1a8e87e9d2008fcd3ce423ae5219c21e49be18d05d72825feb7e2bb687ba35c", "calldata": [ "0x44cd44ad7abf35b9dbe1e17de3610d21", "0x9f806c191aa2a3d47f2b8efc4c412d2f" ], "caller_address": "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "class_hash": "0x5a1a156fd2af56bb992ce31fd2a4765e9b65b84efce45f3063974decaa339a2", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false } ], "events": [], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false }, "fee_transfer_invocation": { "contract_address": "0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x11ecef7f251258", "0x0" ], "caller_address": "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "class_hash": "0x5327164fa21dca89a92e8eae8a5b7ab90f58373e71f0a16d285e5a4abe5a3cf", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x1" ], "calls": [], "events": [ { "order": 0, "keys": [ "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" ], "data": [ "0x35acd6dd6c5045d18ca6d0192af46b335a5402c02d41f46e4e77ea2c951d9a3", "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0x11ecef7f251258", "0x0" ] } ], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false }, "execution_resources": { "l1_gas": 5, "l2_gas": 10, "l1_data_gas": 15 } }, "transaction_hash": "0x6aa7ec89f36e918c9a168ebc9818e9dd19515a2a4bef87d73e1decbd8a7d131" }, { "trace_root": { "type": "DEPLOY_ACCOUNT", "validate_invocation": { "contract_address": "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "entry_point_selector": "0x36fcbf06cd96843058359e1a75928beacfac10727dab22a3972f0af8aa92895", "calldata": [ "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "0x13e91b7ca4192672", "0x1a3bd006d99712e91bd3fd2eb5fafb0f379d9d594125bb527ec7fc5e133122a" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false }, "constructor_invocation": { "contract_address": "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "entry_point_selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194", "calldata": [ "0x1a3bd006d99712e91bd3fd2eb5fafb0f379d9d594125bb527ec7fc5e133122a" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "CONSTRUCTOR", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false }, "fee_transfer_invocation": { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0xe5e432c83b4f", "0x0" ], "caller_address": "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "class_hash": "0x5ffbcfeb50d200a0677c48a129a11245a3fc519d1d98d76882d1c9a1b19c6ed", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x1" ], "calls": [], "events": [ { "order": 0, "keys": [ "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" ], "data": [ "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0xe5e432c83b4f", "0x0" ] } ], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false }, "execution_resources": { "l1_gas": 5, "l2_gas": 10, "l1_data_gas": 15 } }, "transaction_hash": "0x97468f6928d72808b23fe775e7c71893087600792fb36e0d62ec191363bd34" }, { "trace_root": { "type": "DECLARE", "validate_invocation": { "contract_address": "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "entry_point_selector": "0x289da278a8dc833409cabfdad1581e8e7d40e42dcaed693fa4008dcdb4963b3", "calldata": [ "0x1e7c85ba9d58309d1f257ba201523e1a7b695bfeb6523759da24effd8dc6c0f" ], "caller_address": "0x0", "class_hash": "0x5c478ee27f2112411f86f207605b2e2c58cdb647bac0df27f660ef2252359c6", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [], "calls": [], "events": [], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false }, "fee_transfer_invocation": { "contract_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", "entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "calldata": [ "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0xbf730c7e8f2b", "0x0" ], "caller_address": "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "class_hash": "0x5ffbcfeb50d200a0677c48a129a11245a3fc519d1d98d76882d1c9a1b19c6ed", "entry_point_type": "EXTERNAL", "call_type": "CALL", "result": [ "0x1" ], "calls": [], "events": [ { "order": 0, "keys": [ "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" ], "data": [ "0x5f7a835be8a4f03c5d98287713e20e4cc5697fd03552493dfbc38430f5ea38a", "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", "0xbf730c7e8f2b", "0x0" ] } ], "messages": [], "execution_resources": { "l1_gas": 0, "l2_gas": 0 }, "is_reverted": false }, "execution_resources": { "l1_gas": 5, "l2_gas": 10, "l1_data_gas": 15 } }, "transaction_hash": "0x6a2df1337b09691711a66fca7e93e9f9fbc04c70dc6a17b9284b7af39c1a6a1" } ]`, + }, + } + + AssertTracedBlockTransactions(t, &utils.Sepolia, tests) + }) +} + +func AssertTracedBlockTransactions(t *testing.T, n *utils.Network, tests map[string]expectedBlockTrace) { + t.Helper() + mockCtrl := gomock.NewController(t) t.Cleanup(mockCtrl.Finish) - n := &utils.Integration + client := feeder.NewTestClient(t, n) - mockReader := mocks.NewMockReader(mockCtrl) gateway := adaptfeeder.New(client) + mockReader := mocks.NewMockReader(mockCtrl) + mockReader.EXPECT().BlockByNumber(gomock.Any()).DoAndReturn(func(number uint64) (block *core.Block, err error) { - return gateway.BlockByNumber(context.Background(), number) + block, err = gateway.BlockByNumber(context.Background(), number) + + // Simulate gas consumption in block receipts + for _, receipt := range block.Receipts { + receipt.ExecutionResources.TotalGasConsumed = &core.GasConsumed{ + L1Gas: 5, + L2Gas: 10, + L1DataGas: 15, + } + } + return }).AnyTimes() - mockReader.EXPECT().L1Head().Return(nil, db.ErrKeyNotFound).AnyTimes() - tests := map[string]struct { - hash string - blockNumber uint64 - want string - }{ - "old block": { - hash: "0x3ae41b0f023e53151b0c8ab8b9caafb7005d5f41c9ab260276d5bdc49726279", - blockNumber: 0, - want: `[{"trace_root":{"type":"DEPLOY","constructor_invocation":{"contract_address":"0x7b196a359045d4d0c10f73bdf244a9e1205a615dbb754b8df40173364288534","calldata":["0x187d50a5cf3ebd6d4d6fa8e29e4cad0a237759c6416304a25c4ea792ed4bba4","0x42f5af30d6693674296ad87301935d0c159036c3b24af4042ff0270913bf6c6"],"caller_address":"0x0","result":[],"calls":[],"events":[],"messages":[],"execution_resources":{"steps":29}},"execution_resources":{"steps":29,"data_availability":{"l1_gas":1,"l1_data_gas":2}}},"transaction_hash":"0x3fa1bff0c86f34b2eb32c26d12208b6bdb4a5f6a434ac1d4f0e2d1db71bd711"},{"trace_root":{"type":"DEPLOY","constructor_invocation":{"contract_address":"0x64ed79a8ebe97485d3357bbfdf5f6bea0d9db3b5f1feb6e80d564a179122dc6","calldata":["0x5cedec15acd969b0fba39fec9e7d9bd4d0b33f100969ad3a4543039a6f696d4","0xce9801d27b02543f4d88b60aa456860f94ee9f612fc56464abfbdeedc1ab72"],"caller_address":"0x0","result":[],"calls":[],"events":[],"messages":[],"execution_resources":{"steps":29}},"execution_resources":{"steps":29,"data_availability":{"l1_gas":2,"l1_data_gas":3}}},"transaction_hash":"0x154c02cc3165cceadaa32e7238a67061b3a1eac414138c4ebe1408f37fd93eb"},{"trace_root":{"type":"INVOKE","execute_invocation":{"contract_address":"0x64ed79a8ebe97485d3357bbfdf5f6bea0d9db3b5f1feb6e80d564a179122dc6","calldata":["0x17d9c35a8b9a0d4512fa05eafec01c2758a7a5b7ec7b47408a24a4b33124d9b","0x2","0x7f800b5bf79637f8f83f47a8fc4d368b43695c781b22a899f11b5f2faba874a","0x3a7a40d383612b0ad167aec8d90fb07e576e017d07948f63ac318b52511ae93"],"caller_address":"0x0","result":[],"calls":[],"events":[],"messages":[],"execution_resources":{"steps":165,"memory_holes":22,"pedersen_builtin_applications":2,"range_check_builtin_applications":7}},"execution_resources":{"steps":165,"memory_holes":22,"pedersen_builtin_applications":2,"range_check_builtin_applications":7,"data_availability":{"l1_gas":3,"l1_data_gas":4}}},"transaction_hash":"0x7893675c16da857b7c4229cda449e08a4fe13b07ca817e79d1db02e8a046047"},{"trace_root":{"type":"INVOKE","execute_invocation":{"contract_address":"0x64ed79a8ebe97485d3357bbfdf5f6bea0d9db3b5f1feb6e80d564a179122dc6","calldata":["0x17d9c35a8b9a0d4512fa05eafec01c2758a7a5b7ec7b47408a24a4b33124d9b","0x2","0x7f800b5bf79637f8f83f47a8fc4d368b43695c781b22a899f11b5f2faba874a","0xf140b304e9266c72f1054116dd06d9c1c8e981db7bf34e3c6da99640e9a7c8"],"caller_address":"0x0","result":[],"calls":[],"events":[],"messages":[],"execution_resources":{"steps":165,"memory_holes":22,"pedersen_builtin_applications":2,"range_check_builtin_applications":7}},"execution_resources":{"steps":165,"memory_holes":22,"pedersen_builtin_applications":2,"range_check_builtin_applications":7,"data_availability":{"l1_gas":4,"l1_data_gas":5}}},"transaction_hash":"0x4a277d67e3f42c4a343854081d1e2e9e425f1323255e4486d2badb37a1d8630"}]`, - }, - "newer block": { - hash: "0xe3828bd9154ab385e2cbb95b3b650365fb3c6a4321660d98ce8b0a9194f9a3", - blockNumber: 300000, - want: `[{"trace_root":{"type":"INVOKE","validate_invocation":{"contract_address":"0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7","entry_point_selector":"0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775","calldata":["0x1","0x332299dc083f3778122e5b7762bc9d399da18fefe93769aee67bb49f51c8d2","0x2d7cf5d5a324a320f9f37804b1615a533fde487400b41af80f13f7ac5581325","0x0","0x4","0x4","0xaf35ee8ed700ff132c5d1d298a73becda25ccdf9","0x2","0x6cd852fe1b2bbd8587bb0aaeb09813436c57c8ce21e75651e317273a1f22228","0x58feb991988e53fffcba71f6df23c803fb062f1b3bab126d2c9ce574255b36e"],"caller_address":"0x0","class_hash":"0x646a72e2aab2fca75d713fbe4a58f2d12cbd64105621b89dc9ce7045b5bf02b","entry_point_type":"EXTERNAL","call_type":"CALL","result":[],"calls":[],"events":[],"messages":[],"execution_resources":{"steps":89,"range_check_builtin_applications":2,"ecdsa_builtin_applications":1}},"execute_invocation":{"contract_address":"0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7","entry_point_selector":"0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad","calldata":["0x1","0x332299dc083f3778122e5b7762bc9d399da18fefe93769aee67bb49f51c8d2","0x2d7cf5d5a324a320f9f37804b1615a533fde487400b41af80f13f7ac5581325","0x0","0x4","0x4","0xaf35ee8ed700ff132c5d1d298a73becda25ccdf9","0x2","0x6cd852fe1b2bbd8587bb0aaeb09813436c57c8ce21e75651e317273a1f22228","0x58feb991988e53fffcba71f6df23c803fb062f1b3bab126d2c9ce574255b36e"],"caller_address":"0x0","class_hash":"0x646a72e2aab2fca75d713fbe4a58f2d12cbd64105621b89dc9ce7045b5bf02b","entry_point_type":"EXTERNAL","call_type":"CALL","result":[],"calls":[{"contract_address":"0x332299dc083f3778122e5b7762bc9d399da18fefe93769aee67bb49f51c8d2","entry_point_selector":"0x2d7cf5d5a324a320f9f37804b1615a533fde487400b41af80f13f7ac5581325","calldata":["0xaf35ee8ed700ff132c5d1d298a73becda25ccdf9","0x2","0x6cd852fe1b2bbd8587bb0aaeb09813436c57c8ce21e75651e317273a1f22228","0x58feb991988e53fffcba71f6df23c803fb062f1b3bab126d2c9ce574255b36e"],"caller_address":"0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7","class_hash":"0x165e7db96ab97a63c621229617a6d49633737238673477a54720e4c952f2c7e","entry_point_type":"EXTERNAL","call_type":"CALL","result":[],"calls":[],"events":[],"messages":[{"order":0,"to_address":"0xAf35eE8eD700ff132C5d1d298A73BECdA25ccDF9","payload":["0x6cd852fe1b2bbd8587bb0aaeb09813436c57c8ce21e75651e317273a1f22228","0x58feb991988e53fffcba71f6df23c803fb062f1b3bab126d2c9ce574255b36e"]}],"execution_resources":{"steps":233,"memory_holes":1,"range_check_builtin_applications":5}}],"events":[],"messages":[],"execution_resources":{"steps":374,"memory_holes":4,"range_check_builtin_applications":7}},"fee_transfer_invocation":{"contract_address":"0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","entry_point_selector":"0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e","calldata":["0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8","0x127089df3a1984","0x0"],"caller_address":"0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7","class_hash":"0xd0e183745e9dae3e4e78a8ffedcce0903fc4900beace4e0abf192d4c202da3","entry_point_type":"EXTERNAL","call_type":"CALL","result":["0x1"],"calls":[{"contract_address":"0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","entry_point_selector":"0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e","calldata":["0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8","0x127089df3a1984","0x0"],"caller_address":"0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7","class_hash":"0x28d7d394810ad8c52741ad8f7564717fd02c10ced68657a81d0b6710ce22079","entry_point_type":"EXTERNAL","call_type":"DELEGATE","result":["0x1"],"calls":[],"events":[],"messages":[],"execution_resources":{"steps":488,"memory_holes":40,"pedersen_builtin_applications":4,"range_check_builtin_applications":21}}],"events":[],"messages":[],"execution_resources":{"steps":548,"memory_holes":40,"pedersen_builtin_applications":4,"range_check_builtin_applications":21}},"execution_resources":{"steps":1011,"memory_holes":44,"pedersen_builtin_applications":4,"range_check_builtin_applications":30,"ecdsa_builtin_applications":1,"data_availability":{"l1_gas":1,"l1_data_gas":2}}},"transaction_hash":"0x2a648ab1aa6847eb38507fc842e050f256562bf87b26083c332f3f21318c2c3"},{"trace_root":{"type":"INVOKE","validate_invocation":{"contract_address":"0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7","entry_point_selector":"0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775","calldata":["0x1","0x5f9211b05c9609d54a8bf5f9cfa4e2cd5a3cab3b5d79682c585575495a15dd1","0x317eb442b72a9fae758d4fb26830ed0d9f31c8e7da4dbff4e8c59ea6a158e7f","0x0","0x4","0x4","0x447379c077035ef4f442411d0407ce9aa66c558f0060137f6455f4f230eabeb","0x2","0x6811b7755a7dd0ec1fb6f51a883e3f255368e2dfd497b5f6480c00cf9cd5a2e","0x23b9e26720dd7aaf98c7cea56499f48f75dc1d4123f7e2d6c23bfc4d5f4a336"],"caller_address":"0x0","class_hash":"0x646a72e2aab2fca75d713fbe4a58f2d12cbd64105621b89dc9ce7045b5bf02b","entry_point_type":"EXTERNAL","call_type":"CALL","result":[],"calls":[],"events":[],"messages":[],"execution_resources":{"steps":89,"range_check_builtin_applications":2,"ecdsa_builtin_applications":1}},"execute_invocation":{"contract_address":"0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7","entry_point_selector":"0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad","calldata":["0x1","0x5f9211b05c9609d54a8bf5f9cfa4e2cd5a3cab3b5d79682c585575495a15dd1","0x317eb442b72a9fae758d4fb26830ed0d9f31c8e7da4dbff4e8c59ea6a158e7f","0x0","0x4","0x4","0x447379c077035ef4f442411d0407ce9aa66c558f0060137f6455f4f230eabeb","0x2","0x6811b7755a7dd0ec1fb6f51a883e3f255368e2dfd497b5f6480c00cf9cd5a2e","0x23b9e26720dd7aaf98c7cea56499f48f75dc1d4123f7e2d6c23bfc4d5f4a336"],"caller_address":"0x0","class_hash":"0x646a72e2aab2fca75d713fbe4a58f2d12cbd64105621b89dc9ce7045b5bf02b","entry_point_type":"EXTERNAL","call_type":"CALL","result":[],"calls":[{"contract_address":"0x5f9211b05c9609d54a8bf5f9cfa4e2cd5a3cab3b5d79682c585575495a15dd1","entry_point_selector":"0x317eb442b72a9fae758d4fb26830ed0d9f31c8e7da4dbff4e8c59ea6a158e7f","calldata":["0x447379c077035ef4f442411d0407ce9aa66c558f0060137f6455f4f230eabeb","0x2","0x6811b7755a7dd0ec1fb6f51a883e3f255368e2dfd497b5f6480c00cf9cd5a2e","0x23b9e26720dd7aaf98c7cea56499f48f75dc1d4123f7e2d6c23bfc4d5f4a336"],"caller_address":"0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7","class_hash":"0x13abfd2f333f9c69f690f1569140cdae25f6f66e3f371c9cbb998b65f664a85","entry_point_type":"EXTERNAL","call_type":"CALL","result":[],"calls":[],"events":[],"messages":[],"execution_resources":{"steps":166,"memory_holes":22,"pedersen_builtin_applications":2,"range_check_builtin_applications":7}}],"events":[],"messages":[],"execution_resources":{"steps":307,"memory_holes":25,"pedersen_builtin_applications":2,"range_check_builtin_applications":9}},"fee_transfer_invocation":{"contract_address":"0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","entry_point_selector":"0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e","calldata":["0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8","0x3b2d25cd7bccc","0x0"],"caller_address":"0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7","class_hash":"0xd0e183745e9dae3e4e78a8ffedcce0903fc4900beace4e0abf192d4c202da3","entry_point_type":"EXTERNAL","call_type":"CALL","result":["0x1"],"calls":[{"contract_address":"0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","entry_point_selector":"0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e","calldata":["0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8","0x3b2d25cd7bccc","0x0"],"caller_address":"0x58b7ee817bd2978c7657d05d3131e83e301ed1aa79d5ad16f01925fd52d1da7","class_hash":"0x28d7d394810ad8c52741ad8f7564717fd02c10ced68657a81d0b6710ce22079","entry_point_type":"EXTERNAL","call_type":"DELEGATE","result":["0x1"],"calls":[],"events":[],"messages":[],"execution_resources":{"steps":488,"memory_holes":40,"pedersen_builtin_applications":4,"range_check_builtin_applications":21}}],"events":[],"messages":[],"execution_resources":{"steps":548,"memory_holes":40,"pedersen_builtin_applications":4,"range_check_builtin_applications":21}},"execution_resources":{"steps":944,"memory_holes":65,"pedersen_builtin_applications":6,"range_check_builtin_applications":32,"ecdsa_builtin_applications":1,"data_availability":{"l1_gas":2,"l1_data_gas":3}}},"transaction_hash":"0xbc984e8e1fe594dd518a3a51db4f338437a5d2fbdda772d4426b532a67ffff"}]`, - }, - } + mockReader.EXPECT().L1Head().Return(nil, db.ErrKeyNotFound).AnyTimes() for description, test := range tests { t.Run(description, func(t *testing.T) { - mockReader.EXPECT().BlockByHash(utils.HexToFelt(t, test.hash)).DoAndReturn(func(_ *felt.Felt) (block *core.Block, err error) { + mockReader.EXPECT().BlockByHash(utils.HexToFelt(t, test.blockHash)).DoAndReturn(func(_ *felt.Felt) (block *core.Block, err error) { return mockReader.BlockByNumber(test.blockNumber) - }).Times(2) - handler := rpc.New(mockReader, nil, nil, "", nil) - _, httpHeader, jErr := handler.TraceBlockTransactions(context.Background(), rpc.BlockID{Number: test.blockNumber}) - require.Equal(t, rpccore.ErrInternal.Code, jErr.Code) - assert.Equal(t, httpHeader.Get(rpc.ExecutionStepsHeader), "0") + }) + handler := rpc.New(mockReader, nil, nil, "", nil) handler = handler.WithFeeder(client) - trace, httpHeader, jErr := handler.TraceBlockTransactions(context.Background(), rpc.BlockID{Number: test.blockNumber}) + traces, httpHeader, jErr := handler.TraceBlockTransactions(context.Background(), rpc.BlockID{Number: test.blockNumber}) + if n == &utils.Sepolia && description == "newer block" { + // For the newer block test, we test 3 of the block traces (INVOKE, DEPLOY_ACCOUNT, DECLARE) + traces = []rpc.TracedBlockTransaction{traces[0], traces[7], traces[11]} + } + require.Nil(t, jErr) assert.Equal(t, httpHeader.Get(rpc.ExecutionStepsHeader), "0") - jsonStr, err := json.Marshal(trace) + + jsonStr, err := json.Marshal(traces) require.NoError(t, err) - assert.JSONEq(t, test.want, string(jsonStr)) + assert.JSONEq(t, test.wantTrace, string(jsonStr)) + }) + } +} + +func TestTraceBlockTransactionsReturnsError(t *testing.T) { + t.Run("no feeder client set", func(t *testing.T) { + mockCtrl := gomock.NewController(t) + mockReader := mocks.NewMockReader(mockCtrl) + + client := feeder.NewTestClient(t, &utils.Sepolia) + gateway := adaptfeeder.New(client) + + blockNumber := uint64(40000) + + mockReader.EXPECT().BlockByNumber(gomock.Any()).DoAndReturn(func(number uint64) (block *core.Block, err error) { + return gateway.BlockByNumber(context.Background(), number) + }).Times(2) + mockReader.EXPECT().BlockByHash(gomock.Any()).DoAndReturn(func(_ *felt.Felt) (block *core.Block, err error) { + return mockReader.BlockByNumber(blockNumber) + }) + mockReader.EXPECT().L1Head().Return(nil, db.ErrKeyNotFound).AnyTimes() + + // No feeder client is set + handler := rpc.New(mockReader, nil, nil, "", nil) + + tracedBlocks, httpHeader, jErr := handler.TraceBlockTransactions(context.Background(), rpc.BlockID{Number: blockNumber}) + + require.Nil(t, tracedBlocks) + require.Equal(t, rpccore.ErrInternal.Code, jErr.Code) + assert.Equal(t, httpHeader.Get(rpc.ExecutionStepsHeader), "0") + }) +} + +func TestTransactionTraceValidation(t *testing.T) { + validInvokeTransactionTrace := rpc.TransactionTrace{ + Type: rpc.TxnInvoke, + ExecuteInvocation: &rpc.ExecuteInvocation{}, + } + + invalidInvokeTransactionTrace := rpc.TransactionTrace{ + Type: rpc.TxnInvoke, + } + + validDeployAccountTransactionTrace := rpc.TransactionTrace{ + Type: rpc.TxnDeployAccount, + ConstructorInvocation: &rpc.FunctionInvocation{}, + } + + invalidDeployAccountTransactionTrace := rpc.TransactionTrace{ + Type: rpc.TxnDeployAccount, + } + + validL1HandlerTransactionTrace := rpc.TransactionTrace{ + Type: rpc.TxnL1Handler, + FunctionInvocation: &rpc.FunctionInvocation{}, + } + + invalidL1HandlerTransactionTrace := rpc.TransactionTrace{ + Type: rpc.TxnL1Handler, + } + + tests := []struct { + name string + trace rpc.TransactionTrace + wantErr bool + expected string + }{ + { + name: "valid INVOKE tx", + trace: validInvokeTransactionTrace, + wantErr: false, + expected: `{"type":"INVOKE","execute_invocation":{"revert_reason":""},"execution_resources":null}`, + }, + { + name: "invalid INVOKE tx", + trace: invalidInvokeTransactionTrace, + wantErr: true, + expected: ``, + }, + { + name: "valid DEPLOY_ACCOUNT tx", + trace: validDeployAccountTransactionTrace, + wantErr: false, + expected: `{"type":"DEPLOY_ACCOUNT","constructor_invocation":{"contract_address":"0x0","entry_point_selector":null,"calldata":null,"caller_address":"0x0","class_hash":null,"entry_point_type":"","call_type":"","result":null,"calls":null,"events":null,"messages":null,"execution_resources":null,"is_reverted":false},"execution_resources":null}`, + }, + { + name: "invalid DEPLOY_ACCOUNT tx", + trace: invalidDeployAccountTransactionTrace, + wantErr: true, + expected: ``, + }, + { + name: "valid L1_HANDLER tx", + trace: validL1HandlerTransactionTrace, + wantErr: false, + expected: `{"type":"L1_HANDLER","function_invocation":{"contract_address":"0x0","entry_point_selector":null,"calldata":null,"caller_address":"0x0","class_hash":null,"entry_point_type":"","call_type":"","result":null,"calls":null,"events":null,"messages":null,"execution_resources":null,"is_reverted":false},"execution_resources":null}`, + }, + { + name: "invalid L1_HANDLER tx", + trace: invalidL1HandlerTransactionTrace, + wantErr: true, + expected: ``, + }, + } + + validate := validator.Validator() + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + err := validate.Struct(test.trace) + + // Check validation + if test.wantErr { + assert.Error(t, err, "Expected validation to fail, but it passed") + } else { + assert.NoError(t, err, "Expected validation to pass, but it failed") + + // Check marshalling (check required fields) + j, _ := json.Marshal(test.trace) + assert.Equal(t, test.expected, string(j)) + } }) } } @@ -143,21 +311,9 @@ func TestTraceTransaction(t *testing.T) { headState.EXPECT().Class(tx.ClassHash).Return(declaredClass, nil) mockReader.EXPECT().HeadState().Return(headState, nopCloser, nil) - executionResources := `{ - "pedersen": 0, - "rangecheck": 0, - "bitwise": 0, - "ecdsa": 0, - "ecop": 0, - "keccak": 0, - "poseidon": 0, - "segmentarena": 0, - "memoryholes": 0, - "steps": 1, - "data_availability": { - "l1_gas": 1, - "l1_data_gas": 1 - } + innerExecutionResources := `{ + "l1_gas": 1, + "l2_data": 2 }` vmTraceJSON := fmt.Sprintf(`{ @@ -172,22 +328,24 @@ func TestTraceTransaction(t *testing.T) { "declared_classes": [], "replaced_classes": [] } - }`, executionResources) + }`, innerExecutionResources) + vmTrace := new(vm.TransactionTrace) require.NoError(t, json.Unmarshal(json.RawMessage(vmTraceJSON), vmTrace)) - da := []core.DataAvailability{{L1Gas: 1, L1DataGas: 0}} + gc := []core.GasConsumed{{L1Gas: 2, L1DataGas: 3, L2Gas: 4}} overallFee := []*felt.Felt{new(felt.Felt).SetUint64(1)} + stepsUsed := uint64(123) stepsUsedStr := "123" + mockVM.EXPECT().Execute([]core.Transaction{tx}, []core.Class{declaredClass.Class}, []*felt.Felt{}, &vm.BlockInfo{Header: header}, gomock.Any(), &utils.Mainnet, false, false, false, true).Return(vm.ExecutionResults{ - OverallFees: overallFee, - DataAvailability: da, - GasConsumed: gc, - Traces: []vm.TransactionTrace{*vmTrace}, - NumSteps: stepsUsed, + OverallFees: overallFee, + GasConsumed: gc, + Traces: []vm.TransactionTrace{*vmTrace}, + NumSteps: stepsUsed, }, nil) trace, httpHeader, err := handler.TraceTransaction(context.Background(), *hash) @@ -198,15 +356,8 @@ func TestTraceTransaction(t *testing.T) { L1Gas: 2, L1DataGas: 3, L2Gas: 4, - ComputationResources: vm.ComputationResources{ - Steps: 3, - }, - DataAvailability: &vm.DataAvailability{ - L1Gas: 1, - L1DataGas: 0, - }, } - assert.Equal(t, vmTrace, trace) + assert.Equal(t, rpc.AdaptVMTransactionTrace(vmTrace), *trace) }) t.Run("pending block", func(t *testing.T) { hash := utils.HexToFelt(t, "0xceb6a374aff2bbb3537cf35f50df8634b2354a21") @@ -244,21 +395,9 @@ func TestTraceTransaction(t *testing.T) { headState.EXPECT().Class(tx.ClassHash).Return(declaredClass, nil) mockSyncReader.EXPECT().PendingState().Return(headState, nopCloser, nil) - executionResources := `{ - "pedersen": 0, - "rangecheck": 0, - "bitwise": 0, - "ecdsa": 0, - "ecop": 0, - "keccak": 0, - "poseidon": 0, - "segmentarena": 0, - "memoryholes": 0, - "steps": 0, - "data_availability": { - "l1_gas": 1, - "l1_data_gas": 1 - } + innerExecutionResources := `{ + "l1_gas": 1, + "l2_gas": 2 }` vmTraceJSON := fmt.Sprintf(`{ @@ -273,25 +412,28 @@ func TestTraceTransaction(t *testing.T) { "declared_classes": [], "replaced_classes": [] } - }`, executionResources) + }`, innerExecutionResources) + vmTrace := new(vm.TransactionTrace) require.NoError(t, json.Unmarshal(json.RawMessage(vmTraceJSON), vmTrace)) - da := []core.DataAvailability{{L1Gas: 1, L1DataGas: 0}} + gc := []core.GasConsumed{{L1Gas: 2, L1DataGas: 3, L2Gas: 4}} overallFee := []*felt.Felt{new(felt.Felt).SetUint64(1)} + stepsUsed := uint64(123) stepsUsedStr := "123" + mockVM.EXPECT().Execute([]core.Transaction{tx}, []core.Class{declaredClass.Class}, []*felt.Felt{}, &vm.BlockInfo{Header: header}, gomock.Any(), &utils.Mainnet, false, false, false, true). Return(vm.ExecutionResults{ - OverallFees: overallFee, - DataAvailability: da, - GasConsumed: gc, - Traces: []vm.TransactionTrace{*vmTrace}, - NumSteps: stepsUsed, + OverallFees: overallFee, + GasConsumed: gc, + Traces: []vm.TransactionTrace{*vmTrace}, + NumSteps: stepsUsed, }, nil) trace, httpHeader, err := handler.TraceTransaction(context.Background(), *hash) + require.Nil(t, err) assert.Equal(t, httpHeader.Get(rpc.ExecutionStepsHeader), stepsUsedStr) @@ -299,12 +441,130 @@ func TestTraceTransaction(t *testing.T) { L1Gas: 2, L1DataGas: 3, L2Gas: 4, - // other of fields are zero - DataAvailability: &vm.DataAvailability{ - L1Gas: 1, + } + assert.Equal(t, rpc.AdaptVMTransactionTrace(vmTrace), *trace) + }) + + t.Run("reverted INVOKE tx from feeder", func(t *testing.T) { + n := &utils.Sepolia + + handler := rpc.New(mockReader, mockSyncReader, mockVM, "", utils.NewNopZapLogger()) + + client := feeder.NewTestClient(t, n) + handler.WithFeeder(client) + gateway := adaptfeeder.New(client) + + // Tx at index 3 in the block + revertedTxHash := utils.HexToFelt(t, "0x2f00c7f28df2197196440747f97baa63d0851e3b0cfc2efedb6a88a7ef78cb1") + + blockNumber := uint64(18) + blockHash := utils.HexToFelt(t, "0x5beb56c7d9a9fc066e695c3fc467f45532cace83d9979db4ccfd6b77ca476af") + + mockReader.EXPECT().Receipt(revertedTxHash).Return(nil, blockHash, blockNumber, nil) + mockReader.EXPECT().BlockByHash(blockHash).DoAndReturn(func(_ *felt.Felt) (block *core.Block, err error) { + return gateway.BlockByNumber(context.Background(), blockNumber) + }).Times(2) + + mockReader.EXPECT().L1Head().Return(&core.L1Head{ + BlockNumber: 19, // Doesn't really matter for this test + }, nil) + + expectedRevertedTrace := rpc.TransactionTrace{ + Type: rpc.TxnInvoke, + ValidateInvocation: &rpc.FunctionInvocation{ + ContractAddress: *utils.HexToFelt(t, "0x70503f026c7af73cfd2b007fe650e8c310256e9674ac4e42797c291edca5e84"), + EntryPointSelector: utils.HexToFelt(t, "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775"), + Calldata: []felt.Felt{ + *utils.HexToFelt(t, "0x1"), + *utils.HexToFelt(t, "0x7c687d151607710a7ec82ca5ab0ff2c48f52abd3b4a2773938a0cfef723fe6a"), + *utils.HexToFelt(t, "0x10b7e63d3ca05c9baffd985d3e1c3858d4dbf0759f066be0eaddc5d71c2cab5"), + *utils.HexToFelt(t, "0x1"), + *utils.HexToFelt(t, "0xa"), + }, + CallerAddress: *utils.HexToFelt(t, "0x0"), + ClassHash: utils.HexToFelt(t, "0x903752516de5c04fe91600ca6891e325278b2dfc54880ae11a809abb364844"), + EntryPointType: "EXTERNAL", + CallType: "CALL", + Result: []felt.Felt{*utils.HexToFelt(t, "0x56414c4944")}, + Calls: []rpc.FunctionInvocation{}, + Events: []rpcv6.OrderedEvent{}, + Messages: []rpcv6.OrderedL2toL1Message{}, + ExecutionResources: &rpc.InnerExecutionResources{ + L1Gas: 0, + L2Gas: 0, + }, + }, + FeeTransferInvocation: &rpc.FunctionInvocation{ + ContractAddress: *utils.HexToFelt(t, "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7"), + EntryPointSelector: utils.HexToFelt(t, "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e"), + Calldata: []felt.Felt{ + *utils.HexToFelt(t, "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8"), + *utils.HexToFelt(t, "0x2847291f968"), + *utils.HexToFelt(t, "0x0"), + }, + CallerAddress: *utils.HexToFelt(t, "0x70503f026c7af73cfd2b007fe650e8c310256e9674ac4e42797c291edca5e84"), + ClassHash: utils.HexToFelt(t, "0xd0e183745e9dae3e4e78a8ffedcce0903fc4900beace4e0abf192d4c202da3"), + EntryPointType: "EXTERNAL", + CallType: "CALL", + Result: []felt.Felt{*utils.HexToFelt(t, "0x1")}, + Calls: []rpc.FunctionInvocation{ + { + ContractAddress: *utils.HexToFelt(t, "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7"), + EntryPointSelector: utils.HexToFelt(t, "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e"), + Calldata: []felt.Felt{ + *utils.HexToFelt(t, "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8"), + *utils.HexToFelt(t, "0x2847291f968"), + *utils.HexToFelt(t, "0x0"), + }, + CallerAddress: *utils.HexToFelt(t, "0x70503f026c7af73cfd2b007fe650e8c310256e9674ac4e42797c291edca5e84"), + ClassHash: utils.HexToFelt(t, "0x1b661756bf7d16210fc611626e1af4569baa1781ffc964bd018f4585ae241c1"), + EntryPointType: "EXTERNAL", + CallType: "DELEGATE", + Result: []felt.Felt{*utils.HexToFelt(t, "0x1")}, + Calls: []rpc.FunctionInvocation{}, + Events: []rpcv6.OrderedEvent{ + { + Order: 0, + Keys: []*felt.Felt{utils.HexToFelt(t, "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9")}, + Data: []*felt.Felt{ + utils.HexToFelt(t, "0x70503f026c7af73cfd2b007fe650e8c310256e9674ac4e42797c291edca5e84"), + utils.HexToFelt(t, "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8"), + utils.HexToFelt(t, "0x2847291f968"), + utils.HexToFelt(t, "0x0"), + }, + }, + }, + Messages: []rpcv6.OrderedL2toL1Message{}, + ExecutionResources: &rpc.InnerExecutionResources{ + L1Gas: 0, + L2Gas: 0, + }, + }, + }, + Events: []rpcv6.OrderedEvent{}, + Messages: []rpcv6.OrderedL2toL1Message{}, + ExecutionResources: &rpc.InnerExecutionResources{ + L1Gas: 0, + L2Gas: 0, + }, + }, + ExecuteInvocation: &rpc.ExecuteInvocation{ + RevertReason: "Error in the called contract (0x070503f026c7af73cfd2b007fe650e8c310256e9674ac4e42797c291edca5e84):\nError at pc=0:4288:\nGot an exception while executing a hint: Custom Hint Error: Execution failed. Failure reason: 'Fatal'.\nCairo traceback (most recent call last):\nUnknown location (pc=0:67)\nUnknown location (pc=0:1997)\nUnknown location (pc=0:2729)\nUnknown location (pc=0:3577)\n", + }, + ExecutionResources: &rpc.ExecutionResources{ + InnerExecutionResources: rpc.InnerExecutionResources{ + L1Gas: 0, + L2Gas: 0, + }, + L1DataGas: 0, }, } - assert.Equal(t, vmTrace, trace) + + trace, httpHeader, err := handler.TraceTransaction(context.Background(), *revertedTxHash) + + require.Nil(t, err) + assert.Equal(t, httpHeader.Get(rpc.ExecutionStepsHeader), "0") + assert.Equal(t, expectedRevertedTrace, *trace) }) } @@ -386,9 +646,10 @@ func TestTraceBlockTransactions(t *testing.T) { paidL1Fees := []*felt.Felt{(&felt.Felt{}).SetUint64(1)} vmTraceJSON := json.RawMessage(`{ - "validate_invocation": {"execution_resources":{}}, - "execute_invocation": {"execution_resources":{}}, - "fee_transfer_invocation": {"execution_resources":{}}, + "type": "INVOKE", + "validate_invocation": {"execution_resources":{"l1_gas":1,"l2_gas":2}}, + "execute_invocation": {"execution_resources":{"l1_gas":3,"l2_gas":4}}, + "fee_transfer_invocation": {"execution_resources":{"l1_gas":5,"l2_gas":6}}, "state_diff": { "storage_diffs": [], "nonces": [], @@ -398,43 +659,78 @@ func TestTraceBlockTransactions(t *testing.T) { "replaced_classes": [] } }`) + vmTrace := vm.TransactionTrace{} + require.NoError(t, json.Unmarshal(vmTraceJSON, &vmTrace)) + + gc := []core.GasConsumed{{L1Gas: 7, L2Gas: 8, L1DataGas: 9}, {}} stepsUsed := uint64(123) stepsUsedStr := "123" - require.NoError(t, json.Unmarshal(vmTraceJSON, &vmTrace)) + mockVM.EXPECT().Execute(block.Transactions, []core.Class{declaredClass.Class}, paidL1Fees, &vm.BlockInfo{Header: header}, gomock.Any(), n, false, false, false, true). Return(vm.ExecutionResults{ OverallFees: nil, DataAvailability: []core.DataAvailability{{}, {}}, - GasConsumed: []core.GasConsumed{{}, {}}, + GasConsumed: gc, Traces: []vm.TransactionTrace{vmTrace, vmTrace}, NumSteps: stepsUsed, }, nil) result, httpHeader, err := handler.TraceBlockTransactions(context.Background(), rpc.BlockID{Hash: blockHash}) + require.Nil(t, err) assert.Equal(t, httpHeader.Get(rpc.ExecutionStepsHeader), stepsUsedStr) - assert.Equal(t, &vm.TransactionTrace{ - ValidateInvocation: &vm.FunctionInvocation{ExecutionResources: &vm.ExecutionResources{}}, - ExecuteInvocation: &vm.ExecuteInvocation{FunctionInvocation: &vm.FunctionInvocation{ - ExecutionResources: &vm.ExecutionResources{}, - }}, - FeeTransferInvocation: &vm.FunctionInvocation{ExecutionResources: &vm.ExecutionResources{}}, - ExecutionResources: &vm.ExecutionResources{ - DataAvailability: &vm.DataAvailability{}, - }, - StateDiff: &vm.StateDiff{ - StorageDiffs: []vm.StorageDiff{}, - Nonces: []vm.Nonce{}, - DeployedContracts: []vm.DeployedContract{}, + assert.Equal(t, &rpc.TransactionTrace{ + Type: rpc.TxnInvoke, + ValidateInvocation: &rpc.FunctionInvocation{ + Calls: []rpc.FunctionInvocation{}, + Events: []rpcv6.OrderedEvent{}, + Messages: []rpcv6.OrderedL2toL1Message{}, + ExecutionResources: &rpc.InnerExecutionResources{ + L1Gas: 1, + L2Gas: 2, + }, + }, + ExecuteInvocation: &rpc.ExecuteInvocation{ + FunctionInvocation: &rpc.FunctionInvocation{ + Calls: []rpc.FunctionInvocation{}, + Events: []rpcv6.OrderedEvent{}, + Messages: []rpcv6.OrderedL2toL1Message{}, + ExecutionResources: &rpc.InnerExecutionResources{ + L1Gas: 3, + L2Gas: 4, + }, + }, + }, + FeeTransferInvocation: &rpc.FunctionInvocation{ + Calls: []rpc.FunctionInvocation{}, + Events: []rpcv6.OrderedEvent{}, + Messages: []rpcv6.OrderedL2toL1Message{}, + ExecutionResources: &rpc.InnerExecutionResources{ + L1Gas: 5, + L2Gas: 6, + }, + }, + ExecutionResources: &rpc.ExecutionResources{ + InnerExecutionResources: rpc.InnerExecutionResources{ + L1Gas: 7, + L2Gas: 8, + }, + L1DataGas: 9, + }, + StateDiff: &rpcv6.StateDiff{ + StorageDiffs: []rpcv6.StorageDiff{}, + Nonces: []rpcv6.Nonce{}, + DeployedContracts: []rpcv6.DeployedContract{}, DeprecatedDeclaredClasses: []*felt.Felt{}, - DeclaredClasses: []vm.DeclaredClass{}, - ReplacedClasses: []vm.ReplacedClass{}, + DeclaredClasses: []rpcv6.DeclaredClass{}, + ReplacedClasses: []rpcv6.ReplacedClass{}, }, }, result[0].TraceRoot) assert.Equal(t, l1Tx.TransactionHash, result[0].TransactionHash) }) + t.Run("regular block", func(t *testing.T) { blockHash := utils.HexToFelt(t, "0x37b244ea7dc6b3f9735fba02d183ef0d6807a572dd91a63cc1b14b923c1ac0") tx := &core.DeclareTransaction{ @@ -482,8 +778,10 @@ func TestTraceBlockTransactions(t *testing.T) { }`) vmTrace := vm.TransactionTrace{} require.NoError(t, json.Unmarshal(vmTraceJSON, &vmTrace)) + stepsUsed := uint64(123) stepsUsedStr := "123" + mockVM.EXPECT().Execute([]core.Transaction{tx}, []core.Class{declaredClass.Class}, []*felt.Felt{}, &vm.BlockInfo{Header: header}, gomock.Any(), n, false, false, false, true). Return(vm.ExecutionResults{ @@ -494,10 +792,11 @@ func TestTraceBlockTransactions(t *testing.T) { NumSteps: stepsUsed, }, nil) + expectedTrace := rpc.AdaptVMTransactionTrace(&vmTrace) expectedResult := []rpc.TracedBlockTransaction{ { TransactionHash: tx.Hash(), - TraceRoot: &vmTrace, + TraceRoot: &expectedTrace, }, } result, httpHeader, err := handler.TraceBlockTransactions(context.Background(), rpc.BlockID{Hash: blockHash}) @@ -507,6 +806,392 @@ func TestTraceBlockTransactions(t *testing.T) { }) } +func TestAdaptVMTransactionTrace(t *testing.T) { + t.Run("successfully adapt INVOKE trace from vm", func(t *testing.T) { + fromAddr, _ := new(felt.Felt).SetString("0x4c5772d1914fe6ce891b64eb35bf3522aeae1315647314aac58b01137607f3f") + toAddrStr := "0x540552aae708306346466633036396334303062342d24292eadbdc777db86e5" + + payload0, _ := new(felt.Felt).SetString("0x0") + payload1, _ := new(felt.Felt).SetString("0x5ba586f822ce9debae27fa04a3e71721fdc90ff") + payload2, _ := new(felt.Felt).SetString("0x455448") + payload3, _ := new(felt.Felt).SetString("0x31da07977d000") + payload4, _ := new(felt.Felt).SetString("0x0") + + vmTrace := vm.TransactionTrace{ + Type: vm.TxnInvoke, + ValidateInvocation: &vm.FunctionInvocation{ + Messages: []vm.OrderedL2toL1Message{ + { + Order: 0, + From: fromAddr, + To: toAddrStr, + Payload: []*felt.Felt{ + payload0, + payload1, + payload2, + payload3, + payload4, + }, + }, + }, + ExecutionResources: &vm.ExecutionResources{ + L1Gas: 1, + L1DataGas: 2, + L2Gas: 3, + ComputationResources: vm.ComputationResources{ + Steps: 1, + MemoryHoles: 2, + Pedersen: 3, + RangeCheck: 4, + Bitwise: 5, + Ecdsa: 6, + EcOp: 7, + Keccak: 8, + Poseidon: 9, + SegmentArena: 10, + AddMod: 11, + MulMod: 12, + RangeCheck96: 13, + Output: 14, + }, + DataAvailability: &vm.DataAvailability{ + L1Gas: 1, + L1DataGas: 2, + }, + }, + }, + FeeTransferInvocation: &vm.FunctionInvocation{}, + ExecuteInvocation: &vm.ExecuteInvocation{ + RevertReason: "", + FunctionInvocation: &vm.FunctionInvocation{}, + }, + ConstructorInvocation: &vm.FunctionInvocation{}, + FunctionInvocation: &vm.FunctionInvocation{}, + StateDiff: &vm.StateDiff{ //nolint:dupl + StorageDiffs: []vm.StorageDiff{ + { + Address: felt.Zero, + StorageEntries: []vm.Entry{ + { + Key: felt.Zero, + Value: felt.Zero, + }, + }, + }, + }, + Nonces: []vm.Nonce{ + { + ContractAddress: felt.Zero, + Nonce: felt.Zero, + }, + }, + DeployedContracts: []vm.DeployedContract{ + { + Address: felt.Zero, + ClassHash: felt.Zero, + }, + }, + DeprecatedDeclaredClasses: []*felt.Felt{ + &felt.Zero, + }, + DeclaredClasses: []vm.DeclaredClass{ + { + ClassHash: felt.Zero, + CompiledClassHash: felt.Zero, + }, + }, + ReplacedClasses: []vm.ReplacedClass{ + { + ContractAddress: felt.Zero, + ClassHash: felt.Zero, + }, + }, + }, + } + + toAddr, _ := new(felt.Felt).SetString(toAddrStr) + + expectedAdaptedTrace := rpc.TransactionTrace{ + Type: rpc.TxnInvoke, + ValidateInvocation: &rpc.FunctionInvocation{ + Calls: []rpc.FunctionInvocation{}, + Events: []rpcv6.OrderedEvent{}, + Messages: []rpcv6.OrderedL2toL1Message{ + { + Order: 0, + From: fromAddr, + To: toAddr, + Payload: []*felt.Felt{ + payload0, + payload1, + payload2, + payload3, + payload4, + }, + }, + }, + ExecutionResources: &rpc.InnerExecutionResources{ + L1Gas: 1, + L2Gas: 3, + }, + IsReverted: false, + }, + FeeTransferInvocation: &rpc.FunctionInvocation{ + Calls: []rpc.FunctionInvocation{}, + Events: []rpcv6.OrderedEvent{}, + Messages: []rpcv6.OrderedL2toL1Message{}, + IsReverted: false, + }, + ExecuteInvocation: &rpc.ExecuteInvocation{ + RevertReason: "", + FunctionInvocation: &rpc.FunctionInvocation{ + Calls: []rpc.FunctionInvocation{}, + Events: []rpcv6.OrderedEvent{}, + Messages: []rpcv6.OrderedL2toL1Message{}, + IsReverted: false, + }, + }, + StateDiff: &rpcv6.StateDiff{ //nolint:dupl + StorageDiffs: []rpcv6.StorageDiff{ + { + Address: felt.Zero, + StorageEntries: []rpcv6.Entry{ + { + Key: felt.Zero, + Value: felt.Zero, + }, + }, + }, + }, + Nonces: []rpcv6.Nonce{ + { + ContractAddress: felt.Zero, + Nonce: felt.Zero, + }, + }, + DeployedContracts: []rpcv6.DeployedContract{ + { + Address: felt.Zero, + ClassHash: felt.Zero, + }, + }, + DeprecatedDeclaredClasses: []*felt.Felt{ + &felt.Zero, + }, + DeclaredClasses: []rpcv6.DeclaredClass{ + { + ClassHash: felt.Zero, + CompiledClassHash: felt.Zero, + }, + }, + ReplacedClasses: []rpcv6.ReplacedClass{ + { + ContractAddress: felt.Zero, + ClassHash: felt.Zero, + }, + }, + }, + } + + assert.Equal(t, expectedAdaptedTrace, rpc.AdaptVMTransactionTrace(&vmTrace)) + }) + + t.Run("successfully adapt DEPLOY_ACCOUNT tx from vm", func(t *testing.T) { + vmTrace := vm.TransactionTrace{ + Type: vm.TxnDeployAccount, + ValidateInvocation: &vm.FunctionInvocation{}, + FeeTransferInvocation: &vm.FunctionInvocation{}, + ExecuteInvocation: &vm.ExecuteInvocation{ + RevertReason: "", + FunctionInvocation: &vm.FunctionInvocation{}, + }, + ConstructorInvocation: &vm.FunctionInvocation{}, + FunctionInvocation: &vm.FunctionInvocation{}, + } + + expectedAdaptedTrace := rpc.TransactionTrace{ + Type: rpc.TxnDeployAccount, + ValidateInvocation: &rpc.FunctionInvocation{ + Calls: []rpc.FunctionInvocation{}, + Events: []rpcv6.OrderedEvent{}, + Messages: []rpcv6.OrderedL2toL1Message{}, + }, + FeeTransferInvocation: &rpc.FunctionInvocation{ + Calls: []rpc.FunctionInvocation{}, + Events: []rpcv6.OrderedEvent{}, + Messages: []rpcv6.OrderedL2toL1Message{}, + }, + ConstructorInvocation: &rpc.FunctionInvocation{ + Calls: []rpc.FunctionInvocation{}, + Events: []rpcv6.OrderedEvent{}, + Messages: []rpcv6.OrderedL2toL1Message{}, + }, + } + + adaptedTrace := rpc.AdaptVMTransactionTrace(&vmTrace) + + require.Equal(t, expectedAdaptedTrace, adaptedTrace) + }) + + t.Run("successfully adapt L1_HANDLER tx from vm", func(t *testing.T) { + vmTrace := vm.TransactionTrace{ + Type: vm.TxnL1Handler, + ValidateInvocation: &vm.FunctionInvocation{}, + FeeTransferInvocation: &vm.FunctionInvocation{}, + ExecuteInvocation: &vm.ExecuteInvocation{ + RevertReason: "", + FunctionInvocation: &vm.FunctionInvocation{}, + }, + ConstructorInvocation: &vm.FunctionInvocation{}, + FunctionInvocation: &vm.FunctionInvocation{}, + } + + expectedAdaptedTrace := rpc.TransactionTrace{ + Type: rpc.TxnL1Handler, + FunctionInvocation: &rpc.FunctionInvocation{ + Calls: []rpc.FunctionInvocation{}, + Events: []rpcv6.OrderedEvent{}, + Messages: []rpcv6.OrderedL2toL1Message{}, + }, + } + + adaptedTrace := rpc.AdaptVMTransactionTrace(&vmTrace) + + require.Equal(t, expectedAdaptedTrace, adaptedTrace) + }) +} + +func TestAdaptFeederBlockTrace(t *testing.T) { + t.Run("nil block trace", func(t *testing.T) { + block := &rpc.BlockWithTxs{} + + res, err := rpc.AdaptFeederBlockTrace(block, nil) + require.Nil(t, res) + require.Nil(t, err) + }) + + t.Run("inconsistent blockWithTxs and blockTrace", func(t *testing.T) { + blockWithTxs := &rpc.BlockWithTxs{ + Transactions: []*rpc.Transaction{ + {}, + }, + } + blockTrace := &starknet.BlockTrace{} + + res, err := rpc.AdaptFeederBlockTrace(blockWithTxs, blockTrace) + require.Nil(t, res) + require.Equal(t, errors.New("mismatched number of txs and traces"), err) + }) + + t.Run("L1_HANDLER tx gets successfully adapted", func(t *testing.T) { + blockWithTxs := &rpc.BlockWithTxs{ + Transactions: []*rpc.Transaction{ + { + Type: rpc.TxnL1Handler, + }, + }, + } + blockTrace := &starknet.BlockTrace{ + Traces: []starknet.TransactionTrace{ + { + TransactionHash: *new(felt.Felt).SetUint64(1), + FeeTransferInvocation: &starknet.FunctionInvocation{}, + ValidateInvocation: &starknet.FunctionInvocation{}, + FunctionInvocation: &starknet.FunctionInvocation{ + Events: []starknet.OrderedEvent{{ + Order: 1, + Keys: []felt.Felt{*new(felt.Felt).SetUint64(2)}, + Data: []felt.Felt{*new(felt.Felt).SetUint64(3)}, + }}, + ExecutionResources: starknet.ExecutionResources{ + TotalGasConsumed: &starknet.GasConsumed{ + L1Gas: 10, + L2Gas: 11, + L1DataGas: 12, + }, + }, + }, + }, + }, + } + + expectedAdaptedTrace := []rpc.TracedBlockTransaction{ + { + TransactionHash: new(felt.Felt).SetUint64(1), + TraceRoot: &rpc.TransactionTrace{ + Type: rpc.TxnL1Handler, + FunctionInvocation: &rpc.FunctionInvocation{ + Calls: []rpc.FunctionInvocation{}, + Events: []rpcv6.OrderedEvent{{ + Order: 1, + Keys: []*felt.Felt{new(felt.Felt).SetUint64(2)}, + Data: []*felt.Felt{new(felt.Felt).SetUint64(3)}, + }}, + Messages: []rpcv6.OrderedL2toL1Message{}, + ExecutionResources: &rpc.InnerExecutionResources{ + L1Gas: 10, + L2Gas: 11, + }, + }, + }, + }, + } + + res, err := rpc.AdaptFeederBlockTrace(blockWithTxs, blockTrace) + require.Nil(t, err) + require.Equal(t, expectedAdaptedTrace, res) + }) + + t.Run("INVOKE tx gets successfully adapted (with revert error)", func(t *testing.T) { + blockWithTxs := &rpc.BlockWithTxs{ + Transactions: []*rpc.Transaction{ + { + Type: rpc.TxnInvoke, + }, + }, + } + blockTrace := &starknet.BlockTrace{ + Traces: []starknet.TransactionTrace{ + { + TransactionHash: *new(felt.Felt).SetUint64(1), + FeeTransferInvocation: &starknet.FunctionInvocation{}, + ValidateInvocation: &starknet.FunctionInvocation{}, + // When revert error, feeder trace has no FunctionInvocation only RevertError is set + RevertError: "some error", + }, + }, + } + + expectedAdaptedTrace := []rpc.TracedBlockTransaction{ + { + TransactionHash: new(felt.Felt).SetUint64(1), + TraceRoot: &rpc.TransactionTrace{ + Type: rpc.TxnInvoke, + FeeTransferInvocation: &rpc.FunctionInvocation{ + Calls: []rpc.FunctionInvocation{}, + Events: []rpcv6.OrderedEvent{}, + Messages: []rpcv6.OrderedL2toL1Message{}, + ExecutionResources: &rpc.InnerExecutionResources{}, + }, + ValidateInvocation: &rpc.FunctionInvocation{ + Calls: []rpc.FunctionInvocation{}, + Events: []rpcv6.OrderedEvent{}, + Messages: []rpcv6.OrderedL2toL1Message{}, + ExecutionResources: &rpc.InnerExecutionResources{}, + }, + ExecuteInvocation: &rpc.ExecuteInvocation{ + RevertReason: "some error", + }, + }, + }, + } + + res, err := rpc.AdaptFeederBlockTrace(blockWithTxs, blockTrace) + require.Nil(t, err) + require.Equal(t, expectedAdaptedTrace, res) + }) +} + func TestCall(t *testing.T) { mockCtrl := gomock.NewController(t) t.Cleanup(mockCtrl.Finish) diff --git a/rpc/v8/transaction.go b/rpc/v8/transaction.go index cbc9607a11..f73087417c 100644 --- a/rpc/v8/transaction.go +++ b/rpc/v8/transaction.go @@ -268,9 +268,13 @@ type ComputationResources struct { } type ExecutionResources struct { - L1Gas uint64 `json:"l1_gas"` + InnerExecutionResources L1DataGas uint64 `json:"l1_data_gas"` - L2Gas uint64 `json:"l2_gas"` +} + +type InnerExecutionResources struct { + L1Gas uint64 `json:"l1_gas"` + L2Gas uint64 `json:"l2_gas"` } // https://github.com/starkware-libs/starknet-specs/blob/master/api/starknet_api_openrpc.json#L1871 diff --git a/starknet/trace.go b/starknet/trace.go index a044110654..d20de08e25 100644 --- a/starknet/trace.go +++ b/starknet/trace.go @@ -24,6 +24,7 @@ type FunctionInvocation struct { Selector *felt.Felt `json:"selector"` EntryPointType string `json:"entry_point_type"` Result []felt.Felt `json:"result"` + Failed bool `json:"failed"` ExecutionResources ExecutionResources `json:"execution_resources"` InternalCalls []FunctionInvocation `json:"internal_calls"` Events []OrderedEvent `json:"events"` diff --git a/vm/rust/src/jsonrpc.rs b/vm/rust/src/jsonrpc.rs index 554344a15c..4fd70ddd13 100644 --- a/vm/rust/src/jsonrpc.rs +++ b/vm/rust/src/jsonrpc.rs @@ -258,6 +258,7 @@ pub struct FunctionInvocation { pub messages: Vec, #[serde(skip_serializing_if = "Option::is_none")] pub execution_resources: Option, + pub is_reverted: bool, } use blockifier::execution::call_info::CallInfo as BlockifierCallInfo; @@ -291,6 +292,7 @@ impl From for FunctionInvocation { }) .collect(), execution_resources: Some(val.resources.into()), + is_reverted: val.execution.failed, } } } diff --git a/vm/trace.go b/vm/trace.go index 4009beadb4..6fc7ff6f83 100644 --- a/vm/trace.go +++ b/vm/trace.go @@ -122,24 +122,6 @@ func (t *TransactionTrace) allInvocations() []*FunctionInvocation { }, func(i *FunctionInvocation) bool { return i == nil }) } -func (t *TransactionTrace) TotalComputationResources() ComputationResources { - total := ComputationResources{} - for _, invocation := range t.allInvocations() { - r := invocation.ExecutionResources - total.Pedersen += r.Pedersen - total.RangeCheck += r.RangeCheck - total.Bitwise += r.Bitwise - total.Ecdsa += r.Ecdsa - total.EcOp += r.EcOp - total.Keccak += r.Keccak - total.Poseidon += r.Poseidon - total.SegmentArena += r.SegmentArena - total.MemoryHoles += r.MemoryHoles - total.Steps += r.Steps - } - return total -} - func (t *TransactionTrace) RevertReason() string { if t.ExecuteInvocation == nil { return "" @@ -176,6 +158,7 @@ type FunctionInvocation struct { Events []OrderedEvent `json:"events"` Messages []OrderedL2toL1Message `json:"messages"` ExecutionResources *ExecutionResources `json:"execution_resources,omitempty"` + IsReverted bool `json:"is_reverted,omitempty"` } func (invocation *FunctionInvocation) allEvents() []OrderedEvent { @@ -264,14 +247,3 @@ func NewDataAvailability(gasConsumed, dataGasConsumed *felt.Felt, mode core.L1DA return da } - -// TODO: add RPC 0.6, 0.7 and 0.8 support -func (r *ExecutionResources) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - ComputationResources - DataAvailability *DataAvailability `json:"data_availability,omitempty"` - }{ - ComputationResources: r.ComputationResources, - DataAvailability: r.DataAvailability, - }) -} diff --git a/vm/trace_test.go b/vm/trace_test.go index ae18bb8505..b1895e4edc 100644 --- a/vm/trace_test.go +++ b/vm/trace_test.go @@ -138,96 +138,6 @@ func TestAllMessages(t *testing.T) { } } -func TestTotalExecutionResources(t *testing.T) { - resources := &vm.ExecutionResources{ - ComputationResources: vm.ComputationResources{ - Steps: 1, - MemoryHoles: 2, - Pedersen: 3, - RangeCheck: 4, - Bitwise: 5, - Ecdsa: 6, - EcOp: 7, - Keccak: 8, - Poseidon: 9, - SegmentArena: 10, - }, - } - tests := map[string]struct { - multiplier uint64 - trace *vm.TransactionTrace - }{ - "many top-level invocations": { - multiplier: 5, - trace: &vm.TransactionTrace{ - ValidateInvocation: &vm.FunctionInvocation{ - ExecutionResources: resources, - }, - FunctionInvocation: &vm.FunctionInvocation{ - ExecutionResources: resources, - }, - ConstructorInvocation: &vm.FunctionInvocation{ - ExecutionResources: resources, - }, - ExecuteInvocation: &vm.ExecuteInvocation{ - FunctionInvocation: &vm.FunctionInvocation{ - ExecutionResources: resources, - }, - }, - FeeTransferInvocation: &vm.FunctionInvocation{ - ExecutionResources: resources, - }, - }, - }, - "only validate invocation": { - multiplier: 1, - trace: &vm.TransactionTrace{ - ValidateInvocation: &vm.FunctionInvocation{ - ExecutionResources: resources, - }, - }, - }, - "present in some sub-calls": { - multiplier: 2, - trace: &vm.TransactionTrace{ - ValidateInvocation: &vm.FunctionInvocation{ - ExecutionResources: resources, - Calls: []vm.FunctionInvocation{ - { - ExecutionResources: resources, - }, - }, - }, - FunctionInvocation: &vm.FunctionInvocation{ - ExecutionResources: resources, - Calls: []vm.FunctionInvocation{ - { - ExecutionResources: resources, - }, - }, - }, - }, - }, - } - - for description, test := range tests { - t.Run(description, func(t *testing.T) { - require.Equal(t, vm.ComputationResources{ - Steps: resources.Steps * test.multiplier, - MemoryHoles: resources.MemoryHoles * test.multiplier, - Pedersen: resources.Pedersen * test.multiplier, - RangeCheck: resources.RangeCheck * test.multiplier, - Bitwise: resources.Bitwise * test.multiplier, - Ecdsa: resources.Ecdsa * test.multiplier, - EcOp: resources.EcOp * test.multiplier, - Keccak: resources.Keccak * test.multiplier, - Poseidon: resources.Poseidon * test.multiplier, - SegmentArena: resources.SegmentArena * test.multiplier, - }, test.trace.TotalComputationResources()) - }) - } -} - func TestExecuteInvocation(t *testing.T) { tests := map[string]struct { inv vm.ExecuteInvocation