diff --git a/tests/data/transaction/get_transaction_install_contract.json b/tests/data/transaction/get_transaction_install_contract.json new file mode 100644 index 0000000..fe6710b --- /dev/null +++ b/tests/data/transaction/get_transaction_install_contract.json @@ -0,0 +1,1257 @@ +{ + "jsonrpc": "2.0", + "id": "1", + "result": { + "api_version": "2.0.0", + "transaction": { + "Version1": { + "hash": "37eea39f298565a1a7fb136927c2956d896f3e9c41e0c87b06ec03ce33482584", + "payload": { + "initiator_addr": { + "PublicKey": "0184f6d260f4ee6869ddb36affe15456de6ae045278fa2f467bb677561ce0dad55" + }, + "timestamp": "2025-01-03T09:31:08.653Z", + "ttl": "30m", + "chain_name": "casper-net-1", + "pricing_mode": { + "PaymentLimited": { + "payment_amount": 500000000000, + "gas_price_tolerance": 1, + "standard_payment": true + } + }, + "fields": { + "args": { + "Named": [ + [ + "odra_cfg_is_upgradable", + { + "cl_type": "Bool", + "bytes": "00", + "parsed": false + } + ], + [ + "odra_cfg_allow_key_override", + { + "cl_type": "Bool", + "bytes": "01", + "parsed": true + } + ], + [ + "odra_cfg_package_hash_key_name", + { + "cl_type": "String", + "bytes": "170000005374616b6564435350525f7061636b6167655f68617368", + "parsed": "StakedCSPR_package_hash" + } + ], + [ + "validator_address", + { + "cl_type": "PublicKey", + "bytes": "01fed662dc7f1f7af43ad785ba07a8cc05b7a96f9ee69613cfde43bc56bec1140b", + "parsed": "01fed662dc7f1f7af43ad785ba07a8cc05b7a96f9ee69613cfde43bc56bec1140b" + } + ], + [ + "claim_time", + { + "cl_type": "U64", + "bytes": "8085800100000000", + "parsed": 25200000 + } + ] + ] + }, + "entry_point": "Call", + "scheduling": "Standard", + "target": { + "Session": { + "is_install_upgrade": true, + "module_bytes": "00", + "runtime": "VmCasperV1" + } + } + } + }, + "approvals": [ + { + "signer": "0184f6d260f4ee6869ddb36affe15456de6ae045278fa2f467bb677561ce0dad55", + "signature": "01180414bf742a555951705dc73c2156422087bf344a2d6f951c1c253c9c5cf1282b7a22125e909577af2a4ee2818eaf191bd4b427bd0d2c24a24cc5373fb61b03" + } + ] + } + }, + "execution_info": { + "block_hash": "b60c3d043d75678ac2422bbbef9f6e32eee023016fea78830414d9bd6e0cf0ef", + "block_height": 6, + "execution_result": { + "Version2": { + "initiator": { + "PublicKey": "0184f6d260f4ee6869ddb36affe15456de6ae045278fa2f467bb677561ce0dad55" + }, + "error_message": null, + "limit": "500000000000", + "consumed": "311158169340", + "cost": "500000000000", + "transfers": [], + "size_estimate": 241198, + "effects": [ + { + "key": "balance-hold-012da0fd7db2b2284db6a1770d30377c6075a9e591fac025114e6f52c43300bd2e471d812b94010000", + "kind": { + "Write": { + "CLValue": { + "cl_type": "U512", + "bytes": "050088526a74", + "parsed": "500000000000" + } + } + } + }, + { + "key": "uref-c5ae802a50fb72194d3c543805bab1a612186bdf2cc5d62758595694a1928fff-000", + "kind": { + "Write": { + "CLValue": { + "cl_type": "Unit", + "bytes": "", + "parsed": null + } + } + } + }, + { + "key": "account-hash-56befc13a6fd62e18f361700a5e08f966901c34df8041b36ec97d54d605c23de", + "kind": { + "AddKeys": [ + { + "name": "state", + "key": "uref-c5ae802a50fb72194d3c543805bab1a612186bdf2cc5d62758595694a1928fff-007" + } + ] + } + }, + { + "key": "uref-821900c35dcc7bedfa01d4901621990552d80870228b4d9a37e47364ae7d12a6-000", + "kind": { + "Write": { + "CLValue": { + "cl_type": "Unit", + "bytes": "", + "parsed": null + } + } + } + }, + { + "key": "account-hash-56befc13a6fd62e18f361700a5e08f966901c34df8041b36ec97d54d605c23de", + "kind": { + "AddKeys": [ + { + "name": "__events", + "key": "uref-821900c35dcc7bedfa01d4901621990552d80870228b4d9a37e47364ae7d12a6-007" + } + ] + } + }, + { + "key": "uref-c640355c74023b0eb6025d376285235767ffe73d9be57d83576e647aa720eacc-000", + "kind": { + "Write": { + "CLValue": { + "cl_type": "U32", + "bytes": "00000000", + "parsed": 0 + } + } + } + }, + { + "key": "uref-993d25549280a839ef18c81d1211e86766ff29e7b7685912bc0e4e4a4964d886-000", + "kind": { + "Write": { + "CLValue": { + "cl_type": "String", + "bytes": "03000000312e31", + "parsed": "1.1" + } + } + } + }, + { + "key": "uref-5bf9cb0884874cc7d80e5bcab54c5100bfc8773908b85099ab569b32bd6bd72d-000", + "kind": { + "Write": { + "CLValue": { + "cl_type": { + "Map": { + "key": "String", + "value": { + "List": { + "Tuple2": [ + "String", + "Any" + ] + } + } + } + }, + "bytes": "0b000000040000004275726e02000000050000006f776e65720b06000000616d6f756e74070e0000004368616e67655365637572697479020000000500000061646d696e0b0e0000007365635f6368616e67655f6d6170110b03110000004465637265617365416c6c6f77616e636504000000050000006f776e65720b070000007370656e6465720b09000000616c6c6f77616e63650707000000646563725f62790711000000496e637265617365416c6c6f77616e636504000000050000006f776e65720b070000007370656e6465720b09000000616c6c6f77616e63650706000000696e635f627907040000004d696e740200000009000000726563697069656e740b06000000616d6f756e740710000000526f6c6541646d696e4368616e6765640300000004000000726f6c650f200000001300000070726576696f75735f61646d696e5f726f6c650f200000000e0000006e65775f61646d696e5f726f6c650f200000000b000000526f6c654772616e7465640300000004000000726f6c650f2000000007000000616464726573730b0600000073656e6465720b0b000000526f6c655265766f6b65640300000004000000726f6c650f2000000007000000616464726573730b0600000073656e6465720b0c000000536574416c6c6f77616e636503000000050000006f776e65720b070000007370656e6465720b09000000616c6c6f77616e636507080000005472616e73666572030000000600000073656e6465720b09000000726563697069656e740b06000000616d6f756e74070c0000005472616e7366657246726f6d04000000070000007370656e6465720b050000006f776e65720b09000000726563697069656e740b06000000616d6f756e7407", + "parsed": null + } + } + } + }, + { + "key": "account-hash-56befc13a6fd62e18f361700a5e08f966901c34df8041b36ec97d54d605c23de", + "kind": "Identity" + }, + { + "key": "account-hash-56befc13a6fd62e18f361700a5e08f966901c34df8041b36ec97d54d605c23de", + "kind": { + "Write": { + "Account": { + "account_hash": "account-hash-56befc13a6fd62e18f361700a5e08f966901c34df8041b36ec97d54d605c23de", + "named_keys": [ + { + "name": "__events", + "key": "uref-821900c35dcc7bedfa01d4901621990552d80870228b4d9a37e47364ae7d12a6-007" + } + ], + "main_purse": "uref-2da0fd7db2b2284db6a1770d30377c6075a9e591fac025114e6f52c43300bd2e-007", + "associated_keys": [ + { + "account_hash": "account-hash-56befc13a6fd62e18f361700a5e08f966901c34df8041b36ec97d54d605c23de", + "weight": 1 + } + ], + "action_thresholds": { + "deployment": 1, + "key_management": 1 + } + } + } + } + }, + { + "key": "account-hash-56befc13a6fd62e18f361700a5e08f966901c34df8041b36ec97d54d605c23de", + "kind": "Identity" + }, + { + "key": "account-hash-56befc13a6fd62e18f361700a5e08f966901c34df8041b36ec97d54d605c23de", + "kind": { + "Write": { + "Account": { + "account_hash": "account-hash-56befc13a6fd62e18f361700a5e08f966901c34df8041b36ec97d54d605c23de", + "named_keys": [], + "main_purse": "uref-2da0fd7db2b2284db6a1770d30377c6075a9e591fac025114e6f52c43300bd2e-007", + "associated_keys": [ + { + "account_hash": "account-hash-56befc13a6fd62e18f361700a5e08f966901c34df8041b36ec97d54d605c23de", + "weight": 1 + } + ], + "action_thresholds": { + "deployment": 1, + "key_management": 1 + } + } + } + } + }, + { + "key": "account-hash-56befc13a6fd62e18f361700a5e08f966901c34df8041b36ec97d54d605c23de", + "kind": "Identity" + }, + { + "key": "account-hash-56befc13a6fd62e18f361700a5e08f966901c34df8041b36ec97d54d605c23de", + "kind": { + "Write": { + "Account": { + "account_hash": "account-hash-56befc13a6fd62e18f361700a5e08f966901c34df8041b36ec97d54d605c23de", + "named_keys": [], + "main_purse": "uref-2da0fd7db2b2284db6a1770d30377c6075a9e591fac025114e6f52c43300bd2e-007", + "associated_keys": [ + { + "account_hash": "account-hash-56befc13a6fd62e18f361700a5e08f966901c34df8041b36ec97d54d605c23de", + "weight": 1 + } + ], + "action_thresholds": { + "deployment": 1, + "key_management": 1 + } + } + } + } + }, + { + "key": "account-hash-56befc13a6fd62e18f361700a5e08f966901c34df8041b36ec97d54d605c23de", + "kind": "Identity" + }, + { + "key": "account-hash-56befc13a6fd62e18f361700a5e08f966901c34df8041b36ec97d54d605c23de", + "kind": { + "Write": { + "Account": { + "account_hash": "account-hash-56befc13a6fd62e18f361700a5e08f966901c34df8041b36ec97d54d605c23de", + "named_keys": [], + "main_purse": "uref-2da0fd7db2b2284db6a1770d30377c6075a9e591fac025114e6f52c43300bd2e-007", + "associated_keys": [ + { + "account_hash": "account-hash-56befc13a6fd62e18f361700a5e08f966901c34df8041b36ec97d54d605c23de", + "weight": 1 + } + ], + "action_thresholds": { + "deployment": 1, + "key_management": 1 + } + } + } + } + }, + { + "key": "account-hash-56befc13a6fd62e18f361700a5e08f966901c34df8041b36ec97d54d605c23de", + "kind": "Identity" + }, + { + "key": "account-hash-56befc13a6fd62e18f361700a5e08f966901c34df8041b36ec97d54d605c23de", + "kind": { + "Write": { + "Account": { + "account_hash": "account-hash-56befc13a6fd62e18f361700a5e08f966901c34df8041b36ec97d54d605c23de", + "named_keys": [], + "main_purse": "uref-2da0fd7db2b2284db6a1770d30377c6075a9e591fac025114e6f52c43300bd2e-007", + "associated_keys": [ + { + "account_hash": "account-hash-56befc13a6fd62e18f361700a5e08f966901c34df8041b36ec97d54d605c23de", + "weight": 1 + } + ], + "action_thresholds": { + "deployment": 1, + "key_management": 1 + } + } + } + } + }, + { + "key": "uref-5268245ec93d03335ed91c860ac48885fa6ee15156871458a84daa93b2d04f06-000", + "kind": { + "Write": { + "CLValue": { + "cl_type": "Unit", + "bytes": "", + "parsed": null + } + } + } + }, + { + "key": "hash-b71675d8cf701d9bc584cb5152706873110e5158b004fb966ed28be49c66b39a", + "kind": { + "Write": { + "ContractPackage": { + "access_key": "uref-5268245ec93d03335ed91c860ac48885fa6ee15156871458a84daa93b2d04f06-007", + "versions": [], + "disabled_versions": [], + "groups": [], + "lock_status": "Locked" + } + } + } + }, + { + "key": "account-hash-56befc13a6fd62e18f361700a5e08f966901c34df8041b36ec97d54d605c23de", + "kind": { + "AddKeys": [ + { + "name": "StakedCSPR_package_hash", + "key": "hash-b71675d8cf701d9bc584cb5152706873110e5158b004fb966ed28be49c66b39a" + } + ] + } + }, + { + "key": "account-hash-56befc13a6fd62e18f361700a5e08f966901c34df8041b36ec97d54d605c23de", + "kind": { + "AddKeys": [ + { + "name": "StakedCSPR_package_hash_access_token", + "key": "uref-5268245ec93d03335ed91c860ac48885fa6ee15156871458a84daa93b2d04f06-007" + } + ] + } + }, + { + "key": "hash-b71675d8cf701d9bc584cb5152706873110e5158b004fb966ed28be49c66b39a", + "kind": "Identity" + }, + { + "key": "message-topic-94b21891ae273b17eeb6a1899a52ab952bcc4da2e19626563f88d6cf7ab6a2bd-e0846cb0e9995ea903dd1b6a275f9c7d9f23e2f83b6918a8a01ba857ff7efdad", + "kind": { + "Write": { + "MessageTopic": { + "message_count": 0, + "blocktime": 1735896669511, + "topic_name": "EVENTS" + } + } + } + }, + { + "key": "hash-a9fb7ec293465829432a8e543a2c2d5bba6d622c512af7e0cf204f6f536a1cbf", + "kind": { + "Write": { + "ContractWasm": { + "bytes": "00" + } + } + } + }, + { + "key": "hash-94b21891ae273b17eeb6a1899a52ab952bcc4da2e19626563f88d6cf7ab6a2bd", + "kind": { + "Write": { + "Contract": { + "contract_package_hash": "contract-package-b71675d8cf701d9bc584cb5152706873110e5158b004fb966ed28be49c66b39a", + "contract_wasm_hash": "contract-wasm-a9fb7ec293465829432a8e543a2c2d5bba6d622c512af7e0cf204f6f536a1cbf", + "named_keys": [ + { + "name": "__events", + "key": "uref-821900c35dcc7bedfa01d4901621990552d80870228b4d9a37e47364ae7d12a6-007" + }, + { + "name": "__events_ces_version", + "key": "uref-993d25549280a839ef18c81d1211e86766ff29e7b7685912bc0e4e4a4964d886-007" + }, + { + "name": "__events_length", + "key": "uref-c640355c74023b0eb6025d376285235767ffe73d9be57d83576e647aa720eacc-007" + }, + { + "name": "__events_schema", + "key": "uref-5bf9cb0884874cc7d80e5bcab54c5100bfc8773908b85099ab569b32bd6bd72d-007" + }, + { + "name": "state", + "key": "uref-c5ae802a50fb72194d3c543805bab1a612186bdf2cc5d62758595694a1928fff-007" + } + ], + "entry_points": [ + { + "name": "add_to_the_pool", + "entry_point": { + "name": "add_to_the_pool", + "args": [], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "allowance", + "entry_point": { + "name": "allowance", + "args": [ + { + "name": "owner", + "cl_type": "Key" + }, + { + "name": "spender", + "cl_type": "Key" + } + ], + "ret": "U256", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "approve", + "entry_point": { + "name": "approve", + "args": [ + { + "name": "spender", + "cl_type": "Key" + }, + { + "name": "amount", + "cl_type": "U256" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "balance_of", + "entry_point": { + "name": "balance_of", + "args": [ + { + "name": "account", + "cl_type": "Key" + } + ], + "ret": "U256", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "burn", + "entry_point": { + "name": "burn", + "args": [ + { + "name": "owner", + "cl_type": "Key" + }, + { + "name": "amount", + "cl_type": "U256" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "change_security", + "entry_point": { + "name": "change_security", + "args": [ + { + "name": "admin_list", + "cl_type": { + "List": "Key" + } + }, + { + "name": "minter_list", + "cl_type": { + "List": "Key" + } + }, + { + "name": "none_list", + "cl_type": { + "List": "Key" + } + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "claim", + "entry_point": { + "name": "claim", + "args": [ + { + "name": "receipt_id", + "cl_type": "U32" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "decimals", + "entry_point": { + "name": "decimals", + "args": [], + "ret": "U8", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "decrease_allowance", + "entry_point": { + "name": "decrease_allowance", + "args": [ + { + "name": "spender", + "cl_type": "Key" + }, + { + "name": "decr_by", + "cl_type": "U256" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "grant_role", + "entry_point": { + "name": "grant_role", + "args": [ + { + "name": "role", + "cl_type": { + "ByteArray": 32 + } + }, + { + "name": "address", + "cl_type": "Key" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "has_role", + "entry_point": { + "name": "has_role", + "args": [ + { + "name": "role", + "cl_type": { + "ByteArray": 32 + } + }, + { + "name": "address", + "cl_type": "Key" + } + ], + "ret": "Bool", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "increase_allowance", + "entry_point": { + "name": "increase_allowance", + "args": [ + { + "name": "spender", + "cl_type": "Key" + }, + { + "name": "inc_by", + "cl_type": "U256" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "init", + "entry_point": { + "name": "init", + "args": [ + { + "name": "validator_address", + "cl_type": "PublicKey" + }, + { + "name": "claim_time", + "cl_type": "U64" + } + ], + "ret": "Unit", + "access": { + "Groups": [ + "constructor_group" + ] + }, + "entry_point_type": "Called" + } + }, + { + "name": "mint", + "entry_point": { + "name": "mint", + "args": [ + { + "name": "owner", + "cl_type": "Key" + }, + { + "name": "amount", + "cl_type": "U256" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "name", + "entry_point": { + "name": "name", + "args": [], + "ret": "String", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "remove_from_the_pool", + "entry_point": { + "name": "remove_from_the_pool", + "args": [ + { + "name": "amount", + "cl_type": "U512" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "revoke_role", + "entry_point": { + "name": "revoke_role", + "args": [ + { + "name": "role", + "cl_type": { + "ByteArray": 32 + } + }, + { + "name": "address", + "cl_type": "Key" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "stake", + "entry_point": { + "name": "stake", + "args": [], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "staked_cspr", + "entry_point": { + "name": "staked_cspr", + "args": [], + "ret": "U512", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "symbol", + "entry_point": { + "name": "symbol", + "args": [], + "ret": "String", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "total_supply", + "entry_point": { + "name": "total_supply", + "args": [], + "ret": "U256", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "transfer", + "entry_point": { + "name": "transfer", + "args": [ + { + "name": "recipient", + "cl_type": "Key" + }, + { + "name": "amount", + "cl_type": "U256" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "transfer_from", + "entry_point": { + "name": "transfer_from", + "args": [ + { + "name": "owner", + "cl_type": "Key" + }, + { + "name": "recipient", + "cl_type": "Key" + }, + { + "name": "amount", + "cl_type": "U256" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "unstake", + "entry_point": { + "name": "unstake", + "args": [ + { + "name": "scspr_amount", + "cl_type": "U256" + } + ], + "ret": "U32", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "withdraw_from_the_pool", + "entry_point": { + "name": "withdraw_from_the_pool", + "args": [ + { + "name": "amount", + "cl_type": "U512" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + } + ], + "protocol_version": "2.0.0" + } + } + } + }, + { + "key": "hash-b71675d8cf701d9bc584cb5152706873110e5158b004fb966ed28be49c66b39a", + "kind": { + "Write": { + "ContractPackage": { + "access_key": "uref-5268245ec93d03335ed91c860ac48885fa6ee15156871458a84daa93b2d04f06-007", + "versions": [ + { + "protocol_version_major": 2, + "contract_version": 1, + "contract_hash": "contract-94b21891ae273b17eeb6a1899a52ab952bcc4da2e19626563f88d6cf7ab6a2bd" + } + ], + "disabled_versions": [], + "groups": [], + "lock_status": "Locked" + } + } + } + }, + { + "key": "hash-b71675d8cf701d9bc584cb5152706873110e5158b004fb966ed28be49c66b39a", + "kind": "Identity" + }, + { + "key": "uref-248a7b93a71529a51bf94824b76b047d9da6cd504532951ce8abff937355781a-000", + "kind": { + "Write": { + "CLValue": { + "cl_type": "Unit", + "bytes": "", + "parsed": null + } + } + } + }, + { + "key": "hash-b71675d8cf701d9bc584cb5152706873110e5158b004fb966ed28be49c66b39a", + "kind": { + "Write": { + "ContractPackage": { + "access_key": "uref-5268245ec93d03335ed91c860ac48885fa6ee15156871458a84daa93b2d04f06-007", + "versions": [ + { + "protocol_version_major": 2, + "contract_version": 1, + "contract_hash": "contract-94b21891ae273b17eeb6a1899a52ab952bcc4da2e19626563f88d6cf7ab6a2bd" + } + ], + "disabled_versions": [], + "groups": [ + { + "group_name": "constructor_group", + "group_users": [ + "uref-248a7b93a71529a51bf94824b76b047d9da6cd504532951ce8abff937355781a-007" + ] + } + ], + "lock_status": "Locked" + } + } + } + }, + { + "key": "hash-b71675d8cf701d9bc584cb5152706873110e5158b004fb966ed28be49c66b39a", + "kind": "Identity" + }, + { + "key": "hash-94b21891ae273b17eeb6a1899a52ab952bcc4da2e19626563f88d6cf7ab6a2bd", + "kind": "Identity" + }, + { + "key": "hash-a9fb7ec293465829432a8e543a2c2d5bba6d622c512af7e0cf204f6f536a1cbf", + "kind": "Identity" + }, + { + "key": "dictionary-1c74ac170f15151dea984eba5b4e659d728d29ae6c77c86625623af8ea5f695a", + "kind": { + "Write": { + "CLValue": { + "cl_type": "Any", + "bytes": "0500000001000000010e0320000000c5ae802a50fb72194d3c543805bab1a612186bdf2cc5d62758595694a1928fff4000000062313130306338363930356535303433306561666535386638353363666466316439616537303461646232353334346137313036306431613332653930373339", + "parsed": null + } + } + } + }, + { + "key": "uref-c640355c74023b0eb6025d376285235767ffe73d9be57d83576e647aa720eacc-000", + "kind": "Identity" + }, + { + "key": "dictionary-26720948657778e06d316688020cb5a4557117f67a3dac23df0f487edf6bd0b3", + "kind": { + "Write": { + "CLValue": { + "cl_type": "Any", + "bytes": "7b00000077000000110000006576656e745f526f6c654772616e74656400000000000000000000000000000000000000000000000000000000000000000056befc13a6fd62e18f361700a5e08f966901c34df8041b36ec97d54d605c23de0056befc13a6fd62e18f361700a5e08f966901c34df8041b36ec97d54d605c23de0e0320000000821900c35dcc7bedfa01d4901621990552d80870228b4d9a37e47364ae7d12a60100000030", + "parsed": null + } + } + } + }, + { + "key": "uref-c640355c74023b0eb6025d376285235767ffe73d9be57d83576e647aa720eacc-000", + "kind": { + "Write": { + "CLValue": { + "cl_type": "U32", + "bytes": "01000000", + "parsed": 1 + } + } + } + }, + { + "key": "dictionary-8bca243652dc40e0a12484c55b1b93080b8e024a1cb56c89c0f05f7d87e61c10", + "kind": { + "Write": { + "CLValue": { + "cl_type": "Any", + "bytes": "250000002100000001fed662dc7f1f7af43ad785ba07a8cc05b7a96f9ee69613cfde43bc56bec1140b0e0320000000c5ae802a50fb72194d3c543805bab1a612186bdf2cc5d62758595694a1928fff4000000062366333373763353838623738626635616261613861333832396365396665363938396463653663373338666363666238393662363665616361616636623664", + "parsed": null + } + } + } + }, + { + "key": "dictionary-39407b37c80c934350a48b492e69dee186d620b397109debfadd8fa310431423", + "kind": { + "Write": { + "CLValue": { + "cl_type": "Any", + "bytes": "0c0000000800000080858001000000000e0320000000c5ae802a50fb72194d3c543805bab1a612186bdf2cc5d62758595694a1928fff4000000061383637313765313437633463333930363161666139616330656333336635343032346330323438346161353630343161616638656265356638633331633661", + "parsed": null + } + } + } + }, + { + "key": "uref-33ce32ffdcac9b67bd52ff17ab1ff6fc77cbe70c59f4b4b98cdd0b3c177ab2ce-000", + "kind": { + "Write": { + "CLValue": { + "cl_type": "String", + "bytes": "050000007343535052", + "parsed": "sCSPR" + } + } + } + }, + { + "key": "hash-94b21891ae273b17eeb6a1899a52ab952bcc4da2e19626563f88d6cf7ab6a2bd", + "kind": { + "AddKeys": [ + { + "name": "symbol", + "key": "uref-33ce32ffdcac9b67bd52ff17ab1ff6fc77cbe70c59f4b4b98cdd0b3c177ab2ce-007" + } + ] + } + }, + { + "key": "uref-c5a771d72df7ce4fa68c41df8e2f4b9af378f330c2d97bb069759ced33c67ba3-000", + "kind": { + "Write": { + "CLValue": { + "cl_type": "String", + "bytes": "0b0000005374616b65642043535052", + "parsed": "Staked CSPR" + } + } + } + }, + { + "key": "hash-94b21891ae273b17eeb6a1899a52ab952bcc4da2e19626563f88d6cf7ab6a2bd", + "kind": { + "AddKeys": [ + { + "name": "name", + "key": "uref-c5a771d72df7ce4fa68c41df8e2f4b9af378f330c2d97bb069759ced33c67ba3-007" + } + ] + } + }, + { + "key": "uref-b35c359f285becb9209d50807530d05ea1b88a03a67514328c12321a3fd56708-000", + "kind": { + "Write": { + "CLValue": { + "cl_type": "U8", + "bytes": "09", + "parsed": 9 + } + } + } + }, + { + "key": "hash-94b21891ae273b17eeb6a1899a52ab952bcc4da2e19626563f88d6cf7ab6a2bd", + "kind": { + "AddKeys": [ + { + "name": "decimals", + "key": "uref-b35c359f285becb9209d50807530d05ea1b88a03a67514328c12321a3fd56708-007" + } + ] + } + }, + { + "key": "uref-11ff0eb0761793972c2dcf16eade3929591ba28fec7a16e8ba4943ed4770114e-000", + "kind": { + "Write": { + "CLValue": { + "cl_type": "U256", + "bytes": "00", + "parsed": "0" + } + } + } + }, + { + "key": "hash-94b21891ae273b17eeb6a1899a52ab952bcc4da2e19626563f88d6cf7ab6a2bd", + "kind": { + "AddKeys": [ + { + "name": "total_supply", + "key": "uref-11ff0eb0761793972c2dcf16eade3929591ba28fec7a16e8ba4943ed4770114e-007" + } + ] + } + }, + { + "key": "uref-68764473db3ec94967a53846ba6d0c207e2c8e5d5d981d148706a4ca6bc8c8fb-000", + "kind": { + "Write": { + "CLValue": { + "cl_type": "Unit", + "bytes": "", + "parsed": null + } + } + } + }, + { + "key": "hash-94b21891ae273b17eeb6a1899a52ab952bcc4da2e19626563f88d6cf7ab6a2bd", + "kind": { + "AddKeys": [ + { + "name": "balances", + "key": "uref-68764473db3ec94967a53846ba6d0c207e2c8e5d5d981d148706a4ca6bc8c8fb-007" + } + ] + } + }, + { + "key": "dictionary-db5897d233f506bb0379cfec94117fb11f39a2034d6eb081d09fefc9c67f5699", + "kind": { + "Write": { + "CLValue": { + "cl_type": "Any", + "bytes": "0100000000072000000068764473db3ec94967a53846ba6d0c207e2c8e5d5d981d148706a4ca6bc8c8fb2c0000004146612b2f424f6d2f574c686a7a5958414b58676a355a7041634e4e2b4151624e7579583155316758435065", + "parsed": null + } + } + } + }, + { + "key": "uref-c640355c74023b0eb6025d376285235767ffe73d9be57d83576e647aa720eacc-000", + "kind": "Identity" + }, + { + "key": "dictionary-81d5cfe1ff7ec5eea2ffba3f135c70de5195a5350f08e84e1b13c093d9508967", + "kind": { + "Write": { + "CLValue": { + "cl_type": "Any", + "bytes": "34000000300000000a0000006576656e745f4d696e740056befc13a6fd62e18f361700a5e08f966901c34df8041b36ec97d54d605c23de000e0320000000821900c35dcc7bedfa01d4901621990552d80870228b4d9a37e47364ae7d12a60100000031", + "parsed": null + } + } + } + }, + { + "key": "uref-c640355c74023b0eb6025d376285235767ffe73d9be57d83576e647aa720eacc-000", + "kind": { + "Write": { + "CLValue": { + "cl_type": "U32", + "bytes": "02000000", + "parsed": 2 + } + } + } + }, + { + "key": "dictionary-40d655185c4da4cb7cf1d1535893f3651bc397c90e03215e3d4b96309c6a95fc", + "kind": { + "Write": { + "CLValue": { + "cl_type": "Any", + "bytes": "0500000001000000000e0320000000c5ae802a50fb72194d3c543805bab1a612186bdf2cc5d62758595694a1928fff4000000038613131303931646131393665616132656432343265613532373564363939343261656163333533303737613662343361613964623735636466633161343136", + "parsed": null + } + } + } + }, + { + "key": "dictionary-716cc1a82ce9195037dbc4f6cc211bea60a18ac924c4495bf54a88ae5df39015", + "kind": { + "Write": { + "CLValue": { + "cl_type": "Any", + "bytes": "0500000001000000000e0320000000c5ae802a50fb72194d3c543805bab1a612186bdf2cc5d62758595694a1928fff4000000038383765663966343038616164313066633933313063623930313131393862353465663065636261356138306362386361356466376435353438623538623238", + "parsed": null + } + } + } + }, + { + "key": "hash-b71675d8cf701d9bc584cb5152706873110e5158b004fb966ed28be49c66b39a", + "kind": "Identity" + }, + { + "key": "hash-b71675d8cf701d9bc584cb5152706873110e5158b004fb966ed28be49c66b39a", + "kind": { + "Write": { + "ContractPackage": { + "access_key": "uref-5268245ec93d03335ed91c860ac48885fa6ee15156871458a84daa93b2d04f06-007", + "versions": [ + { + "protocol_version_major": 2, + "contract_version": 1, + "contract_hash": "contract-94b21891ae273b17eeb6a1899a52ab952bcc4da2e19626563f88d6cf7ab6a2bd" + } + ], + "disabled_versions": [], + "groups": [ + { + "group_name": "constructor_group", + "group_users": [] + } + ], + "lock_status": "Locked" + } + } + } + }, + { + "key": "balance-hold-012da0fd7db2b2284db6a1770d30377c6075a9e591fac025114e6f52c43300bd2e471d812b94010000", + "kind": { + "Prune": "balance-hold-012da0fd7db2b2284db6a1770d30377c6075a9e591fac025114e6f52c43300bd2e471d812b94010000" + } + }, + { + "key": "balance-hold-002da0fd7db2b2284db6a1770d30377c6075a9e591fac025114e6f52c43300bd2e471d812b94010000", + "kind": { + "Write": { + "CLValue": { + "cl_type": "U512", + "bytes": "050088526a74", + "parsed": "500000000000" + } + } + } + }, + { + "key": "bid-addr-01520037cd249ccbcfeb0b9feae07d8d4f7d922cf88adc4f3e8691f9d34ccc8d09", + "kind": "Identity" + }, + { + "key": "bid-addr-04520037cd249ccbcfeb0b9feae07d8d4f7d922cf88adc4f3e8691f9d34ccc8d090100000000000000", + "kind": { + "Write": { + "BidKind": { + "Credit": { + "validator_public_key": "0190664e16a17594ed2d0e3c279c4cf5894e8db0da15e3b91c938562a1caae32ab", + "era_id": 1, + "amount": "500000000000" + } + } + } + } + } + ] + } + } + } +} +} diff --git a/tests/data/transform/contract_package_v1.json b/tests/data/transform/contract_package_v1.json new file mode 100644 index 0000000..daf01b7 --- /dev/null +++ b/tests/data/transform/contract_package_v1.json @@ -0,0 +1,4 @@ +{ + "key": "hash-f1740bb7fecb174954378ced69b2ced7d0fedd0f37957f6bf00da27670a113ae", + "transform": "WriteContractPackage" +} diff --git a/tests/data/transform/contract_package_v2.json b/tests/data/transform/contract_package_v2.json new file mode 100644 index 0000000..f0cc800 --- /dev/null +++ b/tests/data/transform/contract_package_v2.json @@ -0,0 +1,20 @@ +{ + "key": "hash-b71675d8cf701d9bc584cb5152706873110e5158b004fb966ed28be49c66b39a", + "kind": { + "Write": { + "ContractPackage": { + "access_key": "uref-5268245ec93d03335ed91c860ac48885fa6ee15156871458a84daa93b2d04f06-007", + "versions": [ + { + "protocol_version_major": 2, + "contract_version": 1, + "contract_hash": "contract-94b21891ae273b17eeb6a1899a52ab952bcc4da2e19626563f88d6cf7ab6a2bd" + } + ], + "disabled_versions": [], + "groups": [], + "lock_status": "Locked" + } + } + } +} diff --git a/tests/data/transform/contract_v1.json b/tests/data/transform/contract_v1.json new file mode 100644 index 0000000..ccae9a3 --- /dev/null +++ b/tests/data/transform/contract_v1.json @@ -0,0 +1,4 @@ +{ + "key": "hash-000022b5e09c1c45c35b228f0be16864d7da3985c69ea3c4e16133e9f476e03e", + "transform": "WriteContract" +} diff --git a/tests/data/transform/contract_v2.json b/tests/data/transform/contract_v2.json new file mode 100644 index 0000000..3103967 --- /dev/null +++ b/tests/data/transform/contract_v2.json @@ -0,0 +1,452 @@ +{ + "key": "hash-94b21891ae273b17eeb6a1899a52ab952bcc4da2e19626563f88d6cf7ab6a2bd", + "kind": { + "Write": { + "Contract": { + "contract_package_hash": "contract-package-b71675d8cf701d9bc584cb5152706873110e5158b004fb966ed28be49c66b39a", + "contract_wasm_hash": "contract-wasm-a9fb7ec293465829432a8e543a2c2d5bba6d622c512af7e0cf204f6f536a1cbf", + "named_keys": [ + { + "name": "__events", + "key": "uref-821900c35dcc7bedfa01d4901621990552d80870228b4d9a37e47364ae7d12a6-007" + }, + { + "name": "__events_ces_version", + "key": "uref-993d25549280a839ef18c81d1211e86766ff29e7b7685912bc0e4e4a4964d886-007" + }, + { + "name": "__events_length", + "key": "uref-c640355c74023b0eb6025d376285235767ffe73d9be57d83576e647aa720eacc-007" + }, + { + "name": "__events_schema", + "key": "uref-5bf9cb0884874cc7d80e5bcab54c5100bfc8773908b85099ab569b32bd6bd72d-007" + }, + { + "name": "state", + "key": "uref-c5ae802a50fb72194d3c543805bab1a612186bdf2cc5d62758595694a1928fff-007" + } + ], + "entry_points": [ + { + "name": "add_to_the_pool", + "entry_point": { + "name": "add_to_the_pool", + "args": [], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "allowance", + "entry_point": { + "name": "allowance", + "args": [ + { + "name": "owner", + "cl_type": "Key" + }, + { + "name": "spender", + "cl_type": "Key" + } + ], + "ret": "U256", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "approve", + "entry_point": { + "name": "approve", + "args": [ + { + "name": "spender", + "cl_type": "Key" + }, + { + "name": "amount", + "cl_type": "U256" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "balance_of", + "entry_point": { + "name": "balance_of", + "args": [ + { + "name": "account", + "cl_type": "Key" + } + ], + "ret": "U256", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "burn", + "entry_point": { + "name": "burn", + "args": [ + { + "name": "owner", + "cl_type": "Key" + }, + { + "name": "amount", + "cl_type": "U256" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "change_security", + "entry_point": { + "name": "change_security", + "args": [ + { + "name": "admin_list", + "cl_type": { + "List": "Key" + } + }, + { + "name": "minter_list", + "cl_type": { + "List": "Key" + } + }, + { + "name": "none_list", + "cl_type": { + "List": "Key" + } + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "claim", + "entry_point": { + "name": "claim", + "args": [ + { + "name": "receipt_id", + "cl_type": "U32" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "decimals", + "entry_point": { + "name": "decimals", + "args": [], + "ret": "U8", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "decrease_allowance", + "entry_point": { + "name": "decrease_allowance", + "args": [ + { + "name": "spender", + "cl_type": "Key" + }, + { + "name": "decr_by", + "cl_type": "U256" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "grant_role", + "entry_point": { + "name": "grant_role", + "args": [ + { + "name": "role", + "cl_type": { + "ByteArray": 32 + } + }, + { + "name": "address", + "cl_type": "Key" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "has_role", + "entry_point": { + "name": "has_role", + "args": [ + { + "name": "role", + "cl_type": { + "ByteArray": 32 + } + }, + { + "name": "address", + "cl_type": "Key" + } + ], + "ret": "Bool", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "increase_allowance", + "entry_point": { + "name": "increase_allowance", + "args": [ + { + "name": "spender", + "cl_type": "Key" + }, + { + "name": "inc_by", + "cl_type": "U256" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "init", + "entry_point": { + "name": "init", + "args": [ + { + "name": "validator_address", + "cl_type": "PublicKey" + }, + { + "name": "claim_time", + "cl_type": "U64" + } + ], + "ret": "Unit", + "access": { + "Groups": [ + "constructor_group" + ] + }, + "entry_point_type": "Called" + } + }, + { + "name": "mint", + "entry_point": { + "name": "mint", + "args": [ + { + "name": "owner", + "cl_type": "Key" + }, + { + "name": "amount", + "cl_type": "U256" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "name", + "entry_point": { + "name": "name", + "args": [], + "ret": "String", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "remove_from_the_pool", + "entry_point": { + "name": "remove_from_the_pool", + "args": [ + { + "name": "amount", + "cl_type": "U512" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "revoke_role", + "entry_point": { + "name": "revoke_role", + "args": [ + { + "name": "role", + "cl_type": { + "ByteArray": 32 + } + }, + { + "name": "address", + "cl_type": "Key" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "stake", + "entry_point": { + "name": "stake", + "args": [], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "staked_cspr", + "entry_point": { + "name": "staked_cspr", + "args": [], + "ret": "U512", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "symbol", + "entry_point": { + "name": "symbol", + "args": [], + "ret": "String", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "total_supply", + "entry_point": { + "name": "total_supply", + "args": [], + "ret": "U256", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "transfer", + "entry_point": { + "name": "transfer", + "args": [ + { + "name": "recipient", + "cl_type": "Key" + }, + { + "name": "amount", + "cl_type": "U256" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "transfer_from", + "entry_point": { + "name": "transfer_from", + "args": [ + { + "name": "owner", + "cl_type": "Key" + }, + { + "name": "recipient", + "cl_type": "Key" + }, + { + "name": "amount", + "cl_type": "U256" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "unstake", + "entry_point": { + "name": "unstake", + "args": [ + { + "name": "scspr_amount", + "cl_type": "U256" + } + ], + "ret": "U32", + "access": "Public", + "entry_point_type": "Called" + } + }, + { + "name": "withdraw_from_the_pool", + "entry_point": { + "name": "withdraw_from_the_pool", + "args": [ + { + "name": "amount", + "cl_type": "U512" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Called" + } + } + ], + "protocol_version": "2.0.0" + } + } + } +} diff --git a/tests/rpc/rpc_client_test.go b/tests/rpc/rpc_client_test.go index afcffc0..e996fa9 100644 --- a/tests/rpc/rpc_client_test.go +++ b/tests/rpc/rpc_client_test.go @@ -145,6 +145,9 @@ func Test_DefaultClient_GetTransaction_Example(t *testing.T) { { filePath: "../data/transaction/get_transaction.json", }, + { + filePath: "../data/transaction/get_transaction_install_contract.json", + }, { filePath: "../data/transaction/get_transaction_native_target.json", }, diff --git a/tests/types/transform_test.go b/tests/types/transform_test.go index 7dc33bc..bdc9cb5 100644 --- a/tests/types/transform_test.go +++ b/tests/types/transform_test.go @@ -26,6 +26,58 @@ func Test_Transform_AddUInt512(t *testing.T) { assert.EqualValues(t, 100000000, val.Value().Int64()) } +func Test_Transform_ContractV1(t *testing.T) { + fixture, err := os.ReadFile("../data/transform/contract_v1.json") + require.NoError(t, err) + var transform types.TransformKey + + err = json.Unmarshal(fixture, &transform) + require.NoError(t, err) + assert.True(t, transform.Transform.IsWriteContract()) +} + +func Test_Transform_ContractV2(t *testing.T) { + fixture, err := os.ReadFile("../data/transform/contract_v2.json") + require.NoError(t, err) + var transform types.Transform + + err = json.Unmarshal(fixture, &transform) + require.NoError(t, err) + + contract, err := transform.Kind.ParseAsWriteContract() + require.NoError(t, err) + require.NotEmpty(t, contract.ContractPackageHash) + require.NotEmpty(t, contract.ContractWasmHash) + require.NotEmpty(t, contract.NamedKeys) + require.NotEmpty(t, contract.EntryPoints) + assert.True(t, transform.Kind.IsWriteContract()) +} + +func Test_Transform_ContractPackageV1(t *testing.T) { + fixture, err := os.ReadFile("../data/transform/contract_package_v1.json") + require.NoError(t, err) + var transform types.TransformKey + + err = json.Unmarshal(fixture, &transform) + require.NoError(t, err) + assert.True(t, transform.Transform.IsWriteContractPackage()) +} + +func Test_Transform_ContractPackageV2(t *testing.T) { + fixture, err := os.ReadFile("../data/transform/contract_package_v2.json") + require.NoError(t, err) + var transform types.Transform + + err = json.Unmarshal(fixture, &transform) + require.NoError(t, err) + + contractPackage, err := transform.Kind.ParseAsWriteContractPackage() + require.NoError(t, err) + require.NotEmpty(t, contractPackage.Versions) + require.NotEmpty(t, contractPackage.AccessKey) + assert.True(t, transform.Kind.IsWriteContractPackage()) +} + func Test_Transform_CLValue(t *testing.T) { fixture, err := os.ReadFile("../data/transform/cl_value_v1.json") require.NoError(t, err) diff --git a/types/pricing_mode.go b/types/pricing_mode.go index d410327..8e7b5de 100644 --- a/types/pricing_mode.go +++ b/types/pricing_mode.go @@ -26,7 +26,7 @@ const ( type PricingMode struct { // The original payment model, where the creator of the transaction specifies how much they will pay, at what gas price. - Limited *LimitedMode `json:"Limited,omitempty"` + Limited *LimitedMode `json:"PaymentLimited,omitempty"` // The cost of the transaction is determined by the cost table, per the transaction kind. Fixed *FixedMode `json:"Fixed,omitempty"` // The payment for this transaction was previously reserved, as proven by the receipt hash. diff --git a/types/transform.go b/types/transform.go index 2ebe6aa..e10acbc 100644 --- a/types/transform.go +++ b/types/transform.go @@ -95,8 +95,42 @@ func (t *TransformKind) ParseAsWriteAccount() (key.AccountHash, error) { return jsonRes.WriteAccount, nil } +func (t *TransformKind) IsWriteContractPackage() bool { + // v1 compatible check + if bytes.Equal(*t, []byte("\"WriteContractPackage\"")) { + return true + } + + // v2 compatible check + type rawData struct { + Write *struct { + ContractPackage *struct{} `json:"ContractPackage"` + } `json:"Write"` + } + + jsonRes := rawData{} + json.Unmarshal(*t, &jsonRes) + + return jsonRes.Write != nil && jsonRes.Write.ContractPackage != nil +} + func (t *TransformKind) IsWriteContract() bool { - return bytes.Equal(*t, []byte("\"WriteContract\"")) + // v1 compatible check + if bytes.Equal(*t, []byte("\"WriteContract\"")) { + return true + } + + // v2 compatible check + type rawData struct { + Write *struct { + Contract *struct{} `json:"Contract"` + } `json:"Write"` + } + + jsonRes := rawData{} + json.Unmarshal(*t, &jsonRes) + + return jsonRes.Write != nil && jsonRes.Write.Contract != nil } func (t *TransformKind) IsWriteWithdraw() bool { @@ -198,6 +232,44 @@ func (t *TransformKind) ParseAsWritePackage() (*Package, error) { return jsonRes.Write.Package, nil } +func (t *TransformKind) ParseAsWriteContract() (*Contract, error) { + type rawData struct { + Write *struct { + Contract *Contract `json:"Contract"` + } `json:"Write"` + } + + jsonRes := rawData{} + if err := json.Unmarshal(*t, &jsonRes); err != nil { + return nil, err + } + + if jsonRes.Write == nil || jsonRes.Write.Contract == nil { + return nil, errors.New("error: empty response") + } + + return jsonRes.Write.Contract, nil +} + +func (t *TransformKind) ParseAsWriteContractPackage() (*ContractPackage, error) { + type rawData struct { + Write *struct { + ContractPackage *ContractPackage `json:"ContractPackage"` + } `json:"Write"` + } + + jsonRes := rawData{} + if err := json.Unmarshal(*t, &jsonRes); err != nil { + return nil, err + } + + if jsonRes.Write == nil || jsonRes.Write.ContractPackage == nil { + return nil, errors.New("error: empty response") + } + + return jsonRes.Write.ContractPackage, nil +} + func (t *TransformKind) ParseAsWriteBidKind() (*BidKind, error) { type rawData struct { Write *struct {