godwokenrises / godwoken-web3 Goto Github PK
View Code? Open in Web Editor NEWMoved to monorepo https://github.com/godwokenrises/godwoken/tree/develop/web3
Moved to monorepo https://github.com/godwokenrises/godwoken/tree/develop/web3
deprecate COMPATIBLE_CHAIN_ID
fetch COMPATIBLE_CHAIN_ID from RollupConfig
deprecate DEFAULT_FROM_ADDRESS and DEFAULT_FROM_ID
scan Godwoken accounts and get the first EOA account as DEFAUT_RROM_ID
try to get other configs from Godwoken RPC and simplify the configurations in Web3.env
provide unsatisfy chain config info #194
MINIMAL_GAS_PRICE
for a Polyjuice transaction -> avoid DDoSMINIMAL_FEE
for a Godwoken transaction -> avoid DDoSenv:https://godwoken-testnet-web3-v1-rpc.ckbapp.dev
guopenglin@MacBook-Pro-2-086b godwoken-kicker % curl --location --request POST 'https://godwoken-testnet-web3-v1-rpc.ckbapp.dev' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc":"2.0",
"method":"eth_getTransactionByBlockNumberAndIndex",
"params":["0xffffffffffffffff", "0x0"],
"id":1
}'
{"jsonrpc":"2.0","id":1,"error":{"code":-32000,"message":"header not found"}}
guopenglin@MacBook-Pro-2-086b godwoken-kicker % curl --location --request POST 'https://mainnet.infura.io/v3/719d739434254b88ac95d53e2b6ac997' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc":"2.0",
"method":"eth_getTransactionByBlockNumberAndIndex",
"params":["0xffffffffffffffff", "0x0"],
"id":1
}'
{"jsonrpc":"2.0","id":1,"error":{"code":-32602,"message":"invalid argument 0: block number larger than int64"}}
guopenglin@MacBook-Pro-2-086b godwoken-kicker % curl --location --request POST 'https://godwoken-testnet-web3-v1-rpc.ckbapp.dev' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc":"2.0",
"method":"eth_getTransactionByBlockNumberAndIndex",
"params":["0xffffffffffffffffff", "0x0"],
"id":1
}'
{"jsonrpc":"2.0","id":1,"error":{"code":-32603,"message":"Internal error"}}
guopenglin@MacBook-Pro-2-086b godwoken-kicker % curl --location --request POST 'https://godwoken-testnet-web3-v1-rpc.ckbapp.dev' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc":"2.0",
"method":"eth_getTransactionByBlockNumberAndIndex",
"params":["0xff", "0xffffffffffffff"],
"id":1
}'
{"jsonrpc":"2.0","id":1,"error":{"code":-32603,"message":"Internal error"}}
guopenglin@MacBook-Pro-2-086b godwoken-kicker % curl --location --request POST 'https://mainnet.infura.io/v3/719d739434254b88ac95d53e2b6ac997' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc":"2.0",
"method":"eth_getTransactionByBlockNumberAndIndex",
"params":["0xffffffffffffffffff", "0x0"],
"id":1
}'
{"jsonrpc":"2.0","id":1,"error":{"code":-32602,"message":"invalid argument 0: hex number \u003e 64 bits"}
env: https://github.com/RetricSu/godwoken-kicker.git
branch: compatibility-changes
commit: 76430974cc0b8f88e2bca659725cb8664d3b78d2
solodity code
pragma solidity ^0.6.10;
contract CrossCallTest{
CrossCall cc;
CrossCall cc1;
constructor () public {
cc = new CrossCall();
cc1 = new CrossCall();
cc.setOtherAddress(address(cc1));
cc1.setOtherAddress(address(cc));
}
event throwTestResult(uint256 idx,bool result,bytes bts);
function call_throwTest_1() public {
cc.modType(1);
bytes memory bb;
try cc.throwTest() returns(bool result){
// emit throwTestResult(0,true,bb);
require(false,"cc.throwTest() returns(bool result)");
} catch Error(string memory bt1){
// emit throwTestResult(1,true,bytes(bt1));
require(false,"cc.throwTest() returns(bool result)");
}catch(bytes memory bt2){
emit throwTestResult(2,false,bt2);
}
}
function call_throwTest_2() public {
cc.modType(2);
bytes memory bb;
try cc.throwTest() returns(bool result){
// emit throwTestResult(0,true,bb);
require(false,"cc.throwTest() returns(bool result)");
} catch Error(string memory bt1){
// emit throwTestResult(1,true,bytes(bt1));
require(keccak256(bytes(bt1)) == keccak256("require throw test"),"require throw test");
}catch(bytes memory bt2){
require(false,"cc.throwTest(2) returns(bool result)");
}
}
function call_throwTest_3() public {
cc.modType(3);
bytes memory bb;
try cc.throwTest() returns(bool result){
// emit throwTestResult(0,true,bb);
require(result == true,"cc.throwTest(3) returns(bool result)");
} catch Error(string memory bt1){
// emit throwTestResult(1,true,bytes(bt1));
require(keccak256(bytes(bt1)) == keccak256("require throw test"),"require throw test");
}catch(bytes memory bt2){
require(false,"cc.throwTest(2) returns(bool result)");
}
}
function call_throwTest_4() public {
cc.modType(4);
bytes memory bb;
try cc.throwTest() returns(bool result){
// emit throwTestResult(0,true,bb);
require(false,"exec failed");
} catch Error(string memory bt1){
// emit throwTestResult(1,true,bytes(bt1));
require(keccak256(bytes(bt1)) == keccak256("require throw test"),"chatch 1");
}catch(bytes memory bt2){
// require(false,"cc.throwTest(4) catch 2");
}
}
function call_throwTest_5() public {
cc.modType(5);
bytes memory bb;
try cc.throwTest() returns(bool result){
// emit throwTestResult(0,true,bb);
require(true,"exec failed");
} catch Error(string memory bt1){
// emit throwTestResult(1,true,bytes(bt1));
require(keccak256(bytes(bt1)) == keccak256("require throw test"),"chatch 1");
}catch(bytes memory bt2){
require(false,"cc.throwTest(5) catch 2");
}
}
function call_1() public returns(bool){
uint256 beginSize = cc1.getType1();
cc.callTestFunc(address(cc1),500000000,0,"addModType()");
require(cc1.getType1() == beginSize+1,"addModType failed");
return true;
}
function call_stack(uint stackSize) public returns(uint256){
return cc.call_stack(stackSize-1)+stackSize;
}
function call_out_of_gas() public returns(bool){
uint256 beginSize = cc1.getType1();
try cc.callTestFunc(address(cc1),5,0,"addModType()") returns(bool result,bytes memory bts){
require(!result,"can't do this");
}catch{}
require(cc1.getType1() == beginSize,"addModType failed");
return true;
}
function call_delegatecallFunc() public returns(bool){
uint256 beginSize = cc.getType1();
cc.delegatecallFunc(address(cc1),500000000,"addModType()");
require(cc.getType1() == beginSize+1,"addModType failed");
return true;
}
function call_staticcallFunc() public returns(bool){
uint256 beginSize = cc.getType1();
uint256 cc1BeginSize = cc1.getType1();
try cc.staticcallFunc(address(cc1),500000000,"addModType()") returns(bool result){
require(!result,"exec must failed");
}catch {
}
require(cc1.getType1() == beginSize,"type must not mod ");
require(cc.getType1() == beginSize,"type must not mod ");
return true;
}
function call_throwTest(uint idx) public{
cc.modType(idx);
bytes memory bb;
try cc.throwTest() returns(bool result){
emit throwTestResult(0,true,bb);
}catch Error(string memory bt1 ) {
// This is executed in case
// revert was called inside getData
// and a reason string was provided.
require(keccak256(bytes(bt1)) == keccak256("require throw test"),"require throw test");
emit throwTestResult(1,true,bytes(bt1));
} catch (bytes memory bt2) {
// This is executed in case revert() was used.
emit throwTestResult(2,false,bt2);
}
}
}
contract CrossCall{
address payable otherAddress;
function setOtherAddress(address payable addr) public {
otherAddress = addr;
}
event typeModMsg(uint256);
uint256 public type1;
function getType1() public returns(uint256){
return type1;
}
function callTestFunc(address addr,uint256 useGas,uint valuedata,string memory func) public payable returns (bool,bytes memory){
return addr.call{value:valuedata,gas:useGas}(abi.encodeWithSignature(func));
}
function call_stack(uint stackSize) public returns(uint256){
CrossCall cc = CrossCall(otherAddress);
if(stackSize<=0){
return 1;
}
try cc.call_stack(stackSize-1) returns(uint256 num){
return num+stackSize;
}catch {
return cc.call_stack{gas:100000}(stackSize-1);
}
}
//todo add callcode
// function callcodeFunc(address addr,uint256 useGas,uint valuedata,string memory func) public payable returns (bool,bytes memory){
// return addr.callcode.value(valuedata).gas(useGas)(bytes4(keccak256(func)));
// return addr.callcode{value:valuedata,gas:useGas}(abi.encodeWithSignature(func));
// }
function delegatecallFunc(address addr,uint256 useGas,string memory func) public payable returns (bool,bytes memory){
// return addr.delegatecall.gas(useGas)(bytes4(keccak256(func)));
return addr.delegatecall{gas:useGas}(abi.encodeWithSignature(func));
}
function staticcallFunc(address addr,uint256 useGas,string memory func)public payable returns (bool){
bool success;
bytes4 sig = bytes4(keccak256(bytes(func)));
assembly{
let x := mload(0x40) //Find empty storage location using "free memory pointer"
mstore(x,sig) //Place signature at begining of empty storage
success := staticcall(
useGas, //5k gas
addr, //To addr
x, // Inputs are at location x
0x40, //Inputs size two padded, so 68 bytes
x, //Store output over input
0x00) //Output is 32 bytes long }
}
return success;
}
uint public test_count=1;
function callTest(address addr,uint256 useGas,uint valuedata) public payable returns (bool){
// return addr.call.value(valuedata).gas(useGas)(bytes4(keccak256("test()")));
(bool successed,) = addr.call{value:valuedata,gas:useGas}(abi.encodeWithSignature("test()"));
return successed;
}
function newTest(bool isThrow) public returns(bool){
A a = new A(isThrow);
return true;
}
receive() external payable{
}
// function() payable{}
function getType() public view returns(uint256) {
return type1;
}
function addModType()public returns(bool){
type1+=1;
emit typeModMsg(type1);
}
function modType(uint256 intdata) public returns(uint256){
type1 = intdata;
emit typeModMsg(type1);
return type1;
}
function throwTest() public payable returns(bool){
RollBackContract contract1 = new RollBackContract();
if(type1 == 1){
contract1.assertThrow();
}
if(type1 == 2){
contract1.requiteThrow();
}
if(type1 == 3){
contract1.blanceNotEnough();
}
if(type1 == 4){
contract1.invalOpCode();
}
if(type1 == 5){
contract1.stop();
}
return true;
}
}
contract RollBackContract{
event time(uint256);
constructor() public payable {
A a = new A(true);
}
function new_throw(uint256 idx) public payable{
A a = new A(false);
a.test(msg.sender,address(this));
check_throw(idx);
}
function suicide_throw(uint256 idx) public returns(bool){
A a = new A(true);
a.test1(msg.sender);
check_throw(idx);
return true;
}
function check_throw(uint256 idx) internal{
// time(now);
if(idx%10 > 7){
assert(false);
}
if(idx%10<2){
require(false,"time is too smill");
}
}
function assertThrow() public payable{
emit time(100);
assert(false);
}
function requiteThrow() public payable{
emit time(100);
require(false,"require throw test");
}
function blanceNotEnough() public payable returns(bool){
return msg.sender.send(10);
}
function invalOpCode() public payable{
assembly{ invalid() }
}
function stop() public payable{
assembly{ stop() }
}
}
contract A{
event logKV(address key,address value);
mapping(address => address) hashMap;
bool isThrow;
constructor(bool isThrow) public payable{
logKV(msg.sender,msg.sender);
isThrow = isThrow;
require(isThrow,"time is too smill");
}
function test(address key,address value) public returns(address){
hashMap[key] = value;
logKV(key,value);
return value;
}
function test1(address addr) public{
selfdestruct(payable(addr));
}
}
Error: transaction failed [ See: https://links.ethers.org/v5-errors-CALL_EXCEPTION ] (transactionHash="0xe8f5331987afde47ebbb7cf9fd77d1fd8b758fed21b42c2bdac1524ae021444c", transaction={"hash":"0xe8f5331987afde47ebbb7cf9fd77d1fd8b758fed21b42c2bdac1524ae021444c","type":0,"accessList":null,"blockHash":"0xea252193bf3205ea5b7675a5bea342f359b5952845098e3ec6e4751d077ae1d2","blockNumber":411,"transactionIndex":0,"confirmations":1,"from":"0x0000000000000000000000000000000000000000","gasPrice":{"type":"BigNumber","hex":"0x01"},"gasLimit":{"type":"BigNumber","hex":"0x3c7d"},"to":null,"value":{"type":"BigNumber","hex":"0x00"},"nonce":0,"data":"0x","r":"0x0000000000000000000000000000000000000000000000000000000000000000","s":"0x0000000000000000000000000000000000000000000000000000000000000000","v":0,"creates":"0xBd770416a3345F91E4B34576cb804a576fa48EB1","chainId":0}, receipt={"to":null,"from":"0x0000000000000000000000000000000000000000","contractAddress":null,"transactionIndex":0,"gasUsed":{"type":"BigNumber","hex":"0x3c7d"},"logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","blockHash":"0xea252193bf3205ea5b7675a5bea342f359b5952845098e3ec6e4751d077ae1d2","transactionHash":"0xe8f5331987afde47ebbb7cf9fd77d1fd8b758fed21b42c2bdac1524ae021444c","logs":[],"blockNumber":411,"confirmations":1,"cumulativeGasUsed":{"type":"BigNumber","hex":"0x3c7d"},"status":0,"type":0,"byzantium":true}, code=CALL_EXCEPTION, version=providers/5.6.1)
at Logger.makeError (node_modules/@ethersproject/logger/src.ts/index.ts:261:28)
at Logger.throwError (node_modules/@ethersproject/logger/src.ts/index.ts:273:20)
at EthersProviderWrapper.<anonymous> (node_modules/@ethersproject/providers/src.ts/base-provider.ts:1523:24)
at step (node_modules/@ethersproject/providers/lib/base-provider.js:48:23)
at Object.next (node_modules/@ethersproject/providers/lib/base-provider.js:29:53)
at fulfilled (node_modules/@ethersproject/providers/lib/base-provider.js:20:58)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
ProviderError: Cannot read property 'last_log' of undefined
at HttpProvider.request (node_modules/hardhat/src/internal/core/providers/http.ts:74:19)
at LocalAccountsProvider.request (node_modules/hardhat/src/internal/core/providers/accounts.ts:188:34)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at EthersProviderWrapper.send (node_modules/@nomiclabs/hardhat-ethers/src/internal/ethers-provider-wrapper.ts:13:20)
expected
invoke success
actions
hardhat local net:https://github.com/gpBlockchain/gw-evm-opcode-test/runs/5733029647
godwoken net : https://github.com/gpBlockchain/gw-evm-opcode-test/runs/5733665185?check_suite_focus=true
1.fork https://github.com/gpBlockchain/gw-evm-opcode-test.git
2. exec actions
env: commit bbf09f464f4e07bfefd24fe0f54c5cf1c2d6eeb0 compatibility-changes
15:24:15 0|gw-web3 | rawL2Transaction: {
15:24:15 0|gw-web3 | "from_id": "0x5",
15:24:15 0|gw-web3 | "to_id": "0x151",
15:24:15 0|gw-web3 | "nonce": "0x0",
15:24:15 0|gw-web3 | "args": "0xffffff504f4c5900000000010000000001000000000000000000000000000000000000000000000000000000000000002400000070a082310000000000000000000000000c1efcca2bcb65a532274f3ef24c044ef4ab6d73"
15:24:15 0|gw-web3 | }
15:24:15 0|gw-web3 | Call gw rpc "gw_execute_raw_l2transaction" error: JSONRPCError: server error {"code":0,"message":"can't find backend for script_hash H256([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])"}
15:24:15 0|gw-web3 | [error] JSONRPC Server Error: [bound call] RpcError: Cannot read property 'last_log' of undefined RpcError: Cannot read property 'last_log' of undefined
15:24:15 0|gw-web3 | at Eth.call (/godwoken-web3/packages/api-server/lib/methods/modules/eth.js:331:19)
15:24:15 0|gw-web3 | at runMicrotasks (<anonymous>)
15:24:15 0|gw-web3 | at processTicksAndRejections (internal/process/task_queues.js:95:5)
15:24:15 0|gw-web3 | at async Eth.call (/godwoken-web3/packages/api-server/lib/methods/validator.js:28:20)
15:24:15 0|gw-web3 | at async Server.methods.<computed> (/godwoken-web3/packages/api-server/lib/methods/index.js:49:36)
Steps to reproduce Using E2E
—— Add Token to Wallet
What is correct web3-indexer-config.toml for Godwoken Testnet v1?
compatible_chain_id=1984
l2_sudt_type_script_hash="0xe3e86ae888b3df3328842d11708b8ac30a7385c9f60d67f64efec65b7129e78e"
polyjuice_type_script_hash="0x8755bcc380e3494b6a2ca9657d16fd2254f7570731c4b87867ed8b747b1b3457"
rollup_type_hash="0x4940246f168f4106429dc641add3381a44b5eef61e7754142f594e986671a575"
eth_account_lock_hash="0x10571f91073fdc3cdef4ddad96b4204dd30d6355f3dda9a6d7fc0fa0326408da"
tron_account_lock_hash="0x7e19e979f77305cdd61e39258b747809297ece6ab4d579ee38de8bce85d52124"
godwoken_rpc_url="http://godwoken:8119"
pg_url="postgres://user:password@postgres:5432/lumos"
ws_rpc_url="ws://godwoken:8120"
But I get error:
$ docker-compose logs -f web3-indexer
Attaching to testnet_web3-indexer_1
web3-indexer_1 | [2022-03-19T20:09:27Z ERROR gw_web3_indexer::ws_client] websocket disconnected, will retry after 3s: WebSocketError: I/O failure
web3-indexer_1 | [2022-03-19T20:09:27Z INFO gw_web3_indexer::runner] Sync block 0
web3-indexer_1 | [2022-03-19T20:09:30Z ERROR gw_web3_indexer::ws_client] websocket disconnected, will retry after 3s: WebSocketError: I/O failure
web3-indexer_1 | [2022-03-19T20:09:30Z INFO gw_web3_indexer::runner] Sync block 1
web3-indexer_1 | [2022-03-19T20:09:30Z INFO gw_web3_indexer::runner] Sync block 2
web3-indexer_1 | [2022-03-19T20:09:30Z INFO gw_web3_indexer::runner] Sync block 3
web3-indexer_1 | [2022-03-19T20:09:30Z INFO gw_web3_indexer::runner] Sync block 4
web3-indexer_1 | [2022-03-19T20:09:30Z INFO gw_web3_indexer::runner] Sync block 5
web3-indexer_1 | [2022-03-19T20:09:30Z INFO gw_web3_indexer::runner] Sync block 6
web3-indexer_1 | [2022-03-19T20:09:30Z INFO gw_web3_indexer::runner] Sync block 7
web3-indexer_1 | Error: Can't get script by script_hash: H256([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
testnet_web3-indexer_1 exited with code 1
I restarted the service, it synced more but the error comes back:
Error: Can't get script by script_hash: H256([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
Full configuration: Kuzirashi/nervos-godwoken-testnet-node#3
When i make a chain of calls example
each call return ContractTransaction
. i can wait for the transaction to be mined by using method wait
wait
method call under the hood WaitForTransaction from ethers.
wait
method accept number of confirmations -> 1 confirmation is 1 block
Default implementation of ethers js provider 1 confirmation. So when we call wait without parameters it should wait 1 block
ethers call eth_getTransactionReceipt
I wonder if Godwoken return receipt when transaction is pending? (it should return null)
and confirmation is calculate as currentBlockNumber on BlockChain - blockNumber of receipt + 1
The problem is when i set it up as 1 confirmation It doesn't wait and MetaMask queue the calls which leads to crash of request number 2 because i have to approve my ERC20 token
I solved this problem by setting up confirmations to 2 but there is a drawback. Now when action is done inside MetaMask is still wait 1 block and after that i can run next method in my case deposit
on ENV blockchain 1 confirmation should wait until the transaction is mined and when MetaMask show that operation is completed we should go to next action
env:https://godwoken-testnet-web3-v1-rpc.ckbapp.dev/
eth_getFilterChanges query filterId from eth_newFilter ,response logs only latest block num,and logs order not same as the hardhat
step:
eth_newFilter
,[])log
to increase block heighteth_getFilterChanges
,filterId) let BeginBlkNum = await ethers.provider.getBlockNumber();
const filterId = await ethers.provider.send("eth_newFilter", [{}]);
await sendTxToAddBlockNum(ethers.provider,3)
const logs = await ethers.provider.send("eth_getFilterChanges", [filterId]);
let endBlkNum = await ethers.provider.getBlockNumber();
console.log("logs:",logs)
console.log("begin blkNum:",BeginBlkNum.toString())
console.log("end blkNum:",endBlkNum.toString())
for (let i = 0; i < logs.length; i++) {
console.log("blockNumber:",BigNumber.from(logs[i].blockNumber.toString()).toString(),"blkIdx:",logs[i].transactionIndex,"logIndex:",logs[i].logIndex)
}
async function sendTxToAddBlockNum(provider, blockNum) {
let endNum = await provider.getBlockNumber() + blockNum;
let currentNum = await provider.getBlockNumber();
console.log("currentNum:",currentNum," end:",endNum)
while (currentNum < endNum) {
await sendRandomTx(provider)
currentNum = await provider.getBlockNumber();
console.log("currentNum:",currentNum," end:",endNum)
}
console.log("curren block num:",endNum)
}
async function sendRandomTx(provider){
//send log tx
try {
await provider.send("eth_sendTransaction", [{
"data": "0x60806040527f82d627ada1235e696c62b3c7b3472cc1c8d6960898ef528f60ca8000bcbbcbfd600160405162000036919062000055565b60405180910390a162000090565b6200004f816200007c565b82525050565b60006020820190506200006c600083018462000044565b92915050565b6000819050919050565b6000620000898262000072565b9050919050565b6159c580620000a06000396000f3fe60806040526004361061002d5760003560e01c80632bc6e683146100435780636c3bbd111461005a57610034565b3661003457005b34801561004057600080fd5b50005b34801561004f57600080fd5b50610058610083565b005b34801561006657600080fd5b50610081600480360381019061007c9190612dec565b612542565b005b7f2267aefac5af610051a1420ece2966621852e059c5a2a8aa31ce55bb0e3b555e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff806040516100d29190613aba565b60405180910390a17f2267aefac5af610051a1420ece2966621852e059c5a2a8aa31ce55bb0e3b555e607f60405161010a9190613aba565b60405180910390a17fe39db033ae4ccb3b51c6197f92c0a29dad887a71f7f26e032280ab6a4f4ea80060006040516101429190613e1a565b60405180910390a17fe39db033ae4ccb3b51c6197f92c0a29dad887a71f7f26e032280ab6a4f4ea80060ff60405161017a9190613e1a565b60405180910390a17f2267aefac5af610051a1420ece2966621852e059c5a2a8aa31ce55bb0e3b555e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff806040516101d19190613aba565b60405180910390a17f2267aefac5af610051a1420ece2966621852e059c5a2a8aa31ce55bb0e3b555e607f6040516102099190613aba565b60405180910390a17fe39db033ae4ccb3b51c6197f92c0a29dad887a71f7f26e032280ab6a4f4ea80060006040516102419190613e1a565b60405180910390a17fe39db033ae4ccb3b51c6197f92c0a29dad887a71f7f26e032280ab6a4f4ea80060ff6040516102799190613e1a565b60405180910390a17f070ce88a6ce1a8855527f7c015b38895a0167b595c76cb1e610ebb2fbcc1cd9f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80006040516102d09190613883565b60405180910390a17f070ce88a6ce1a8855527f7c015b38895a0167b595c76cb1e610ebb2fbcc1cd9f617fff6040516103099190613883565b60405180910390a17ff752be3804265f4a34e93a946393e264e01f7632e19b70168e18c2cc82baf9a960006040516103419190613be3565b60405180910390a17ff752be3804265f4a34e93a946393e264e01f7632e19b70168e18c2cc82baf9a961ffff60405161037a9190613be3565b60405180910390a17f857ad569e1fd593b615806d0115eca10227a408427caf36e4003046f07f6b0617fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000006040516103d191906139ac565b60405180910390a17f857ad569e1fd593b615806d0115eca10227a408427caf36e4003046f07f6b061627fffff60405161040b91906139ac565b60405180910390a17f8a700458ab3ad06c3f0bd20407230093d0a0fe3c749a6f188803e31928065e8660006040516104439190613d0c565b60405180910390a17f8a700458ab3ad06c3f0bd20407230093d0a0fe3c749a6f188803e31928065e8662ffffff60405161047d9190613d0c565b60405180910390a17f092b29bb19d8b8e8c13a43671b38c553754ef16c728eef7b7d06486c8a13383c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff800000006040516104d491906139e2565b60405180910390a17f092b29bb19d8b8e8c13a43671b38c553754ef16c728eef7b7d06486c8a13383c637fffffff60405161050f91906139e2565b60405180910390a17fb8175cbe300af7df3e29543198a1b41bcba6daa22b99e76a21ca62bfc231260f60006040516105479190613d42565b60405180910390a17fb8175cbe300af7df3e29543198a1b41bcba6daa22b99e76a21ca62bfc231260f63ffffffff6040516105829190613d42565b60405180910390a17fe12c1db4f04103b275cb84a2ba35a5ce00745ef1ccb9aeda0bb66955c2e7b3fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff80000000006040516105d991906139fd565b60405180910390a17fe12c1db4f04103b275cb84a2ba35a5ce00745ef1ccb9aeda0bb66955c2e7b3fe647fffffffff60405161061591906139fd565b60405180910390a17f7ddc8d28df6e28fc9ffd391871093b92362b636d7d3fbabbded431ab295dc727600060405161064d9190613d5d565b60405180910390a17f7ddc8d28df6e28fc9ffd391871093b92362b636d7d3fbabbded431ab295dc72764ffffffffff6040516106899190613d5d565b60405180910390a17fcedf44c599ccdb61476915830196faf3738191ddaa1136a56731b6804836deb07fffffffffffffffffffffffffffffffffffffffffffffffffffff8000000000006040516106e09190613a18565b60405180910390a17fcedf44c599ccdb61476915830196faf3738191ddaa1136a56731b6804836deb0657fffffffffff60405161071d9190613a18565b60405180910390a17f53e387047290039a1cd8b0b9407cd083c86c632acd909c4921a42f3f9763bf6560006040516107559190613d78565b60405180910390a17f53e387047290039a1cd8b0b9407cd083c86c632acd909c4921a42f3f9763bf6565ffffffffffff6040516107929190613d78565b60405180910390a17f2e59e9225b9c8459a106dd525a63cec81ed231a3751bc112b633c9624c27e5967fffffffffffffffffffffffffffffffffffffffffffffffffff800000000000006040516107e99190613a33565b60405180910390a17f2e59e9225b9c8459a106dd525a63cec81ed231a3751bc112b633c9624c27e596667fffffffffffff6040516108279190613a33565b60405180910390a17fc6837b046cd6ab97e401e33d67b234ae393d10d8d9b2b07df2a1c8b77b7d92b9600060405161085f9190613d93565b60405180910390a17fc6837b046cd6ab97e401e33d67b234ae393d10d8d9b2b07df2a1c8b77b7d92b966ffffffffffffff60405161089d9190613d93565b60405180910390a17fc8b24ebcfdbf8221a00e3a7c0d9bcae0ca1cdca4d3abe02aea2f691eada891ee7fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000006040516108f49190613a4e565b60405180910390a17fc8b24ebcfdbf8221a00e3a7c0d9bcae0ca1cdca4d3abe02aea2f691eada891ee677fffffffffffffff6040516109339190613a4e565b60405180910390a17fa6885ec77ae25f433724e0862913791b377dc1a5d0b54c479d5d0bd2ddee5147600060405161096b9190613dae565b60405180910390a17fa6885ec77ae25f433724e0862913791b377dc1a5d0b54c479d5d0bd2ddee514767ffffffffffffffff6040516109aa9190613dae565b60405180910390a17f1541e9e23da3e77c13b7a8b5a63504034aed992b5f8e1b709ddbab67ca98b7007fffffffffffffffffffffffffffffffffffffffffffffff800000000000000000604051610a019190613a69565b60405180910390a17f1541e9e23da3e77c13b7a8b5a63504034aed992b5f8e1b709ddbab67ca98b700687fffffffffffffffff604051610a419190613a69565b60405180910390a17f38acf574c9a09195276114f803e1b14aa5fa35fe5ba5608e1541e67cb34ca2916000604051610a799190613dc9565b60405180910390a17f38acf574c9a09195276114f803e1b14aa5fa35fe5ba5608e1541e67cb34ca29168ffffffffffffffffff604051610ab99190613dc9565b60405180910390a17fc0a8b99072e6786b1aae4a7707ee08f52ba70589ec4ff38bd2bc25228b3b47b47fffffffffffffffffffffffffffffffffffffffffffff80000000000000000000604051610b109190613a84565b60405180910390a17fc0a8b99072e6786b1aae4a7707ee08f52ba70589ec4ff38bd2bc25228b3b47b4697fffffffffffffffffff604051610b519190613a84565b60405180910390a17f54a033948e529800065b9e031719d2d8dfbd1ca5be2a416bfced0a77c1c68b7b6000604051610b899190613de4565b60405180910390a17f54a033948e529800065b9e031719d2d8dfbd1ca5be2a416bfced0a77c1c68b7b69ffffffffffffffffffff604051610bca9190613de4565b60405180910390a17faca9be1db7ecae1c9221213817a11119347b1fcd5b7054b0a839e180e96426fb7fffffffffffffffffffffffffffffffffffffffffff8000000000000000000000604051610c219190613a9f565b60405180910390a17faca9be1db7ecae1c9221213817a11119347b1fcd5b7054b0a839e180e96426fb6a7fffffffffffffffffffff604051610c639190613a9f565b60405180910390a17f0d9cd5f49d03cf1d5d963d27581418ab678c801958745fbc5c24b7e387b1b0346000604051610c9b9190613dff565b60405180910390a17f0d9cd5f49d03cf1d5d963d27581418ab678c801958745fbc5c24b7e387b1b0346affffffffffffffffffffff604051610cdd9190613dff565b60405180910390a17f43d5b38b495e25d12c3ec118a731113a2fe6c4be36ad771430a17414f5bb050d7fffffffffffffffffffffffffffffffffffffffff800000000000000000000000604051610d349190613ad5565b60405180910390a17f43d5b38b495e25d12c3ec118a731113a2fe6c4be36ad771430a17414f5bb050d6b7fffffffffffffffffffffff604051610d779190613ad5565b60405180910390a17fe0d2d5db80ea5781647a555fec42c258c02ce29873b57a5cd01d52c6ef0ce9096000604051610daf9190613e35565b60405180910390a17fe0d2d5db80ea5781647a555fec42c258c02ce29873b57a5cd01d52c6ef0ce9096bffffffffffffffffffffffff604051610df29190613e35565b60405180910390a17ff034428006dbcc87f3a1d3b9d3e273b360e85780be5d220f02119447812b6eab7fffffffffffffffffffffffffffffffffffffff80000000000000000000000000604051610e499190613790565b60405180910390a17ff034428006dbcc87f3a1d3b9d3e273b360e85780be5d220f02119447812b6eab6c7fffffffffffffffffffffffff604051610e8d9190613790565b60405180910390a17fa19592a973e151339eb1a757809fcb0ea22de35ee8bd3605153758b57781dbf36000604051610ec59190613af0565b60405180910390a17fa19592a973e151339eb1a757809fcb0ea22de35ee8bd3605153758b57781dbf36cffffffffffffffffffffffffff604051610f099190613af0565b60405180910390a17f5d5c555f8950a05c47ba8e4092f135b6c6e3f73513485f83a4d8864aab6d9d407fffffffffffffffffffffffffffffffffffff8000000000000000000000000000604051610f6091906137ab565b60405180910390a17f5d5c555f8950a05c47ba8e4092f135b6c6e3f73513485f83a4d8864aab6d9d406d7fffffffffffffffffffffffffff604051610fa591906137ab565b60405180910390a17f0dd8250699d7092f1d9729f4e382ccc5b667b95f7cb926b8a0b0c67f624414f06000604051610fdd9190613b0b565b60405180910390a17f0dd8250699d7092f1d9729f4e382ccc5b667b95f7cb926b8a0b0c67f624414f06dffffffffffffffffffffffffffff6040516110229190613b0b565b60405180910390a17f4638caa21c44a8c6e236bc52dacb4694bb26e7edb8c699bf2f4997337c3d28297fffffffffffffffffffffffffffffffffff80000000000000000000000000000060405161107991906137c6565b60405180910390a17f4638caa21c44a8c6e236bc52dacb4694bb26e7edb8c699bf2f4997337c3d28296e7fffffffffffffffffffffffffffff6040516110bf91906137c6565b60405180910390a17f39e8b45dcba3fd0dd610cd4ecdaee851adda527e0c3a860ef6e3bf464d27cb3560006040516110f79190613b26565b60405180910390a17f39e8b45dcba3fd0dd610cd4ecdaee851adda527e0c3a860ef6e3bf464d27cb356effffffffffffffffffffffffffffff60405161113d9190613b26565b60405180910390a17f83c7fd9fdbaafbb19c0a635aba684084f43e4e981deb72d4efc5d67024a2ecf07fffffffffffffffffffffffffffffffff8000000000000000000000000000000060405161119491906137e1565b60405180910390a17f83c7fd9fdbaafbb19c0a635aba684084f43e4e981deb72d4efc5d67024a2ecf06f7fffffffffffffffffffffffffffffff6040516111db91906137e1565b60405180910390a17f9494f80c3bd288ceda4ba59d5420de2915ac7033420e39fa489374d10a5b5c5160006040516112139190613b41565b60405180910390a17f9494f80c3bd288ceda4ba59d5420de2915ac7033420e39fa489374d10a5b5c516fffffffffffffffffffffffffffffffff60405161125a9190613b41565b60405180910390a17f3722459e9340c4d3c2b030cc576da7bc6c616b10312d5943911490a718c563837fffffffffffffffffffffffffffffff80000000000000000000000000000000006040516112b191906137fc565b60405180910390a17f3722459e9340c4d3c2b030cc576da7bc6c616b10312d5943911490a718c56383707fffffffffffffffffffffffffffffffff6040516112f991906137fc565b60405180910390a17fd3a66a9ce40975b3cbf04788f78e1d94f391609664da1027a4159c443a939ec360006040516113319190613b5c565b60405180910390a17fd3a66a9ce40975b3cbf04788f78e1d94f391609664da1027a4159c443a939ec370ffffffffffffffffffffffffffffffffff6040516113799190613b5c565b60405180910390a17f8c3a0ce2f84759544fb0b728ae0a4fcb8a7a3788754151db7471fabe89507cae7fffffffffffffffffffffffffffff8000000000000000000000000000000000006040516113d09190613817565b60405180910390a17f8c3a0ce2f84759544fb0b728ae0a4fcb8a7a3788754151db7471fabe89507cae717fffffffffffffffffffffffffffffffffff6040516114199190613817565b60405180910390a17feeaafd5eee4ac69d67d3cf1f97f38be53b693d38a867fc9b3507ed57a2b39aa460006040516114519190613b77565b60405180910390a17feeaafd5eee4ac69d67d3cf1f97f38be53b693d38a867fc9b3507ed57a2b39aa471ffffffffffffffffffffffffffffffffffff60405161149a9190613b77565b60405180910390a17f78a68a479cb591a6b4029ea35c8f54e03b0a2b42397f34229fe0326e60f025007fffffffffffffffffffffffffff800000000000000000000000000000000000006040516114f19190613832565b60405180910390a17f78a68a479cb591a6b4029ea35c8f54e03b0a2b42397f34229fe0326e60f02500727fffffffffffffffffffffffffffffffffffff60405161153b9190613832565b60405180910390a17f1908734f8f577e175ceeb0378b4ab0a85631146c37f6d056386f07baa230e6bd60006040516115739190613b92565b60405180910390a17f1908734f8f577e175ceeb0378b4ab0a85631146c37f6d056386f07baa230e6bd72ffffffffffffffffffffffffffffffffffffff6040516115bd9190613b92565b60405180910390a17f7efaccc30071c33b5992bd2db0c76cb93ab0419a0d1acde98ae419eed4bd99007fffffffffffffffffffffffff8000000000000000000000000000000000000000604051611614919061384d565b60405180910390a17f7efaccc30071c33b5992bd2db0c76cb93ab0419a0d1acde98ae419eed4bd9900737fffffffffffffffffffffffffffffffffffffff60405161165f919061384d565b60405180910390a17f96d2bf576cbdfcf98903aaeedb3924b02c221abf7fd079a7ba1a4b48e3a963fc60006040516116979190613bad565b60405180910390a17f96d2bf576cbdfcf98903aaeedb3924b02c221abf7fd079a7ba1a4b48e3a963fc73ffffffffffffffffffffffffffffffffffffffff6040516116e29190613bad565b60405180910390a17fab7d8f86967868baef531383428e0aed4f2456e1470d8ab6c45d0b12aa95476d7fffffffffffffffffffffff8000000000000000000000000000000000000000006040516117399190613868565b60405180910390a17fab7d8f86967868baef531383428e0aed4f2456e1470d8ab6c45d0b12aa95476d747fffffffffffffffffffffffffffffffffffffffff6040516117859190613868565b60405180910390a17f3c22029c3be883bbd51ee824e752259e7da3d02ed46360756cf05e4df84e734160006040516117bd9190613bc8565b60405180910390a17f3c22029c3be883bbd51ee824e752259e7da3d02ed46360756cf05e4df84e734174ffffffffffffffffffffffffffffffffffffffffff6040516118099190613bc8565b60405180910390a17fd527924b6859052f692c5471150d2054b71c332683e79f3ad379af47f28b0cd57fffffffffffffffffffff80000000000000000000000000000000000000000000604051611860919061389e565b60405180910390a17fd527924b6859052f692c5471150d2054b71c332683e79f3ad379af47f28b0cd5757fffffffffffffffffffffffffffffffffffffffffff6040516118ad919061389e565b60405180910390a17f8136618d5884ad827ed0b57f2db546dc09c92f5d5b731fc0c55238ee5a02f5c760006040516118e59190613bfe565b60405180910390a17f8136618d5884ad827ed0b57f2db546dc09c92f5d5b731fc0c55238ee5a02f5c775ffffffffffffffffffffffffffffffffffffffffffff6040516119329190613bfe565b60405180910390a17f0cb49d26a0e9827234760769785d8d813ddbfa26932e2575fe6ffd3f8a69828b7fffffffffffffffffff800000000000000000000000000000000000000000000060405161198991906138b9565b60405180910390a17f0cb49d26a0e9827234760769785d8d813ddbfa26932e2575fe6ffd3f8a69828b767fffffffffffffffffffffffffffffffffffffffffffff6040516119d791906138b9565b60405180910390a17ff300cb178334be46c9ceaedd160696532282928ad127a9d7dfc39fd7093db2c46000604051611a0f9190613c19565b60405180910390a17ff300cb178334be46c9ceaedd160696532282928ad127a9d7dfc39fd7093db2c476ffffffffffffffffffffffffffffffffffffffffffffff604051611a5d9190613c19565b60405180910390a17f25fe83151e1689cec4269c4962accd513fb5475738c4565770c03e4157b9cf3d7fffffffffffffffff800000000000000000000000000000000000000000000000604051611ab491906138d4565b60405180910390a17f25fe83151e1689cec4269c4962accd513fb5475738c4565770c03e4157b9cf3d777fffffffffffffffffffffffffffffffffffffffffffffff604051611b0391906138d4565b60405180910390a17f64a81847bcd1d270e1668e475a62d56b8a8cbf533826316e184081107595e35c6000604051611b3b9190613c34565b60405180910390a17f64a81847bcd1d270e1668e475a62d56b8a8cbf533826316e184081107595e35c77ffffffffffffffffffffffffffffffffffffffffffffffff604051611b8a9190613c34565b60405180910390a17fc4bbd7e624e7731461c8d0dc29cbaabad8d9616c12fc76f3c77d72bd6afece217fffffffffffffff80000000000000000000000000000000000000000000000000604051611be191906138ef565b60405180910390a17fc4bbd7e624e7731461c8d0dc29cbaabad8d9616c12fc76f3c77d72bd6afece21787fffffffffffffffffffffffffffffffffffffffffffffffff604051611c3191906138ef565b60405180910390a17ffa98b1f9e97901ad85689f57bc12d448e99382c3b5299aa91526e357cd98ca066000604051611c699190613c4f565b60405180910390a17ffa98b1f9e97901ad85689f57bc12d448e99382c3b5299aa91526e357cd98ca0678ffffffffffffffffffffffffffffffffffffffffffffffffff604051611cb99190613c4f565b60405180910390a17fc29d0ffd468220a32a645c4a5f2295d5ab3328073d4ab09d206cc2154f963f1d7fffffffffffff8000000000000000000000000000000000000000000000000000604051611d10919061390a565b60405180910390a17fc29d0ffd468220a32a645c4a5f2295d5ab3328073d4ab09d206cc2154f963f1d797fffffffffffffffffffffffffffffffffffffffffffffffffff604051611d61919061390a565b60405180910390a17fab651f9501ae2880e18f1100a48d882e23cce986d86f4495b32ee4f396f258086000604051611d999190613c6a565b60405180910390a17fab651f9501ae2880e18f1100a48d882e23cce986d86f4495b32ee4f396f2580879ffffffffffffffffffffffffffffffffffffffffffffffffffff604051611dea9190613c6a565b60405180910390a17fea250c3374edfe6e160ab4c5137553730c08a1317da252f2827463a6dce7ef077fffffffffff800000000000000000000000000000000000000000000000000000604051611e419190613925565b60405180910390a17fea250c3374edfe6e160ab4c5137553730c08a1317da252f2827463a6dce7ef077a7fffffffffffffffffffffffffffffffffffffffffffffffffffff604051611e939190613925565b60405180910390a17fe7086bd7119dfb24016e6a6cde729f9bd295d7bfa25ca2483a3e9793bc1c19ce6000604051611ecb9190613c85565b60405180910390a17fe7086bd7119dfb24016e6a6cde729f9bd295d7bfa25ca2483a3e9793bc1c19ce7affffffffffffffffffffffffffffffffffffffffffffffffffffff604051611f1d9190613c85565b60405180910390a17f44bd67aa0b0e1492abee89902956d05c912cb59a1e2538781ffcda7e13365b447fffffffff80000000000000000000000000000000000000000000000000000000604051611f749190613940565b60405180910390a17f44bd67aa0b0e1492abee89902956d05c912cb59a1e2538781ffcda7e13365b447b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff604051611fc79190613940565b60405180910390a17f067f65f2ac46ad2f63fbc39ba62226d4aa64838b5b4f64777180f9f54db563c66000604051611fff9190613ca0565b60405180910390a17f067f65f2ac46ad2f63fbc39ba62226d4aa64838b5b4f64777180f9f54db563c67bffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040516120529190613ca0565b60405180910390a17f0321a1ee57fc1eced5318abf7d2b3ec0708ff5b2d46048e98aa4542b8c1d7bb77fffffff80000000000000000000000000000000000000000000000000000000006040516120a9919061395b565b60405180910390a17f0321a1ee57fc1eced5318abf7d2b3ec0708ff5b2d46048e98aa4542b8c1d7bb77c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040516120fd919061395b565b60405180910390a17fb2b4b2cd73ef08d7fcb9debddab85bb07d9c7bf3b74ca60489a441cfa240a1aa60006040516121359190613cbb565b60405180910390a17fb2b4b2cd73ef08d7fcb9debddab85bb07d9c7bf3b74ca60489a441cfa240a1aa7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040516121899190613cbb565b60405180910390a17f9d7d79cb4ad2bff4c89235f60373f0b7cb84381cacb3a53ce497bacdd4693e8b7fffff8000000000000000000000000000000000000000000000000000000000006040516121e09190613976565b60405180910390a17f9d7d79cb4ad2bff4c89235f60373f0b7cb84381cacb3a53ce497bacdd4693e8b7d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040516122359190613976565b60405180910390a17fcb91913339b903c0831f14bfb95a32a56396044eda28dec586463c10c66ace04600060405161226d9190613cd6565b60405180910390a17fcb91913339b903c0831f14bfb95a32a56396044eda28dec586463c10c66ace047dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040516122c29190613cd6565b60405180910390a17fe8f0143859114e86c9d0e7f81304bdb6f8fffce52e759d7fff484fb8be09052c7fff800000000000000000000000000000000000000000000000000000000000006040516123199190613991565b60405180910390a17fe8f0143859114e86c9d0e7f81304bdb6f8fffce52e759d7fff484fb8be09052c7e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60405161236f9190613991565b60405180910390a17e65b96199e9d64a5e0efeaaedce8a55d50b3fa144722996f9896e810758466460006040516123a69190613cf1565b60405180910390a17e65b96199e9d64a5e0efeaaedce8a55d50b3fa144722996f9896e81075846647effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040516123fb9190613cf1565b60405180910390a17f7a85d688e553401d74214c12b1f0616553b1af01fb5c50ca50c757d23abde76f7f800000000000000000000000000000000000000000000000000000000000000060405161245291906139c7565b60405180910390a17f7a85d688e553401d74214c12b1f0616553b1af01fb5c50ca50c757d23abde76f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040516124a991906139c7565b60405180910390a17fe4fcd3f982103a3661e399095fce5f74fc3211aaa51a7fa2564735c2334d8ba260006040516124e19190613d27565b60405180910390a17fe4fcd3f982103a3661e399095fce5f74fc3211aaa51a7fa2564735c2334d8ba27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040516125389190613d27565b60405180910390a1565b7faaead702cddd44ca1d804a0cec9ea870ab4035319d20cda8b5e30195af738ab48161256d9061493b565b60405161257a919061351c565b60405180910390a17f6c0ee3c4349a63e4f0b57d90cb019f12ac018c67734e946ab5cf176eef0848be816125ad90614da8565b6040516125ba9190613645565b60405180910390a17febf3cd6c5eed06292abf11861c0b4b0b0921f3be0e4316ab43ca8c9fe8f3a4e6816125ed90615215565b6040516125fa91906136b1565b60405180910390a17f705bfeb7ebe2870a9f06c71774b0677ab28318e4d7e4b097fab05a559170ead48161262d906153b1565b60405161263a91906136cc565b60405180910390a17f96d2b9918c0c377cf62b201d4bc4a3edcb63c87acc5f50b48f3e782a7589154e8161266d90615418565b60405161267a91906136e7565b60405180910390a17f60bd17cf1e1a61ac63df94312037d428004fdb87113b73e0077a938e206f43f5816126ad9061547f565b6040516126ba9190613702565b60405180910390a17f4f829a5fa4485af253c2daf60fb988268461fd4806c788f0e9174928cfe6b940816126ed906154e6565b6040516126fa919061371d565b60405180910390a17f14829a98ecb68612c2581e51138306a35d47295af3a343682a2c1a2f31d265918161272d9061554d565b60405161273a9190613738565b60405180910390a17fc88148e8d790e3e8ea74714c50601a2540aeadd5857a542a4eb933f6815f20d38161276d906155b4565b60405161277a9190613753565b60405180910390a17f121309f4285edd3c5b449ab3ab64e710222fe06183f1accacdbdec809d109055816127ad906149a2565b6040516127ba919061340e565b60405180910390a17f4cf363db3d453c5944061b63602cb4faf7b1985beedb6404f7f4ecc595cc6434816127ed90614a09565b6040516127fa9190613429565b60405180910390a17fef43ef3b51139cc1018a705e0068ed61802ad08fa8aae2bbd7fb7693207945948161282d90614a70565b60405161283a9190613444565b60405180910390a17f26032e823340e8f514ab508e96a28c073f3275d6bc73f36acca89d8f3a2f76b38161286d90614ad7565b60405161287a919061345f565b60405180910390a17f4043c44378c5e165a7a15fd034b3fe65c049c1644bba8b9602b99ecf87c74dac816128ad90614b3e565b6040516128ba919061347a565b60405180910390a17ff0e47a87cb9054462cef1cf528ebe900f71fd28b6675335243e7cb3dcd039d45816128ed90614ba5565b6040516128fa9190613495565b60405180910390a17f857154572a2177f064626e32f3d4a9881b08d900713ca23252726e5b89a9798d8161292d90614c0c565b60405161293a91906134b0565b60405180910390a17f8a11c9c8c03711e8a2c5d608b8d3dfa354b6d59cc9051feaa20cd91c4012bb558161296d90614c73565b60405161297a91906134cb565b60405180910390a17f4dd05669239b3424dc756c026bc09bece902a7ea6e935ee89bf610f76a0eb524816129ad90614cda565b6040516129ba91906134e6565b60405180910390a17f7c22d9ee358645e97d6276f52344ee4b242f83b487637f4cbe3f388df0e66d49816129ed90614d41565b6040516129fa9190613501565b60405180910390a17f3043161ce410fc234d2223c6573ded2aff58b9ef0f56091a22ede4db2e3c3f9381612a2d90614e0f565b604051612a3a9190613537565b60405180910390a17f050f35d370f8e57156397749a0b1548ba9731f669b22dec5fc2380362fb719ec81612a6d90614e76565b604051612a7a9190613552565b60405180910390a17f9af9a4ecab0ef4d99f3e152cecaaad1d39c8c966b4eb19c972e885717e20bbbb81612aad90614edd565b604051612aba919061356d565b60405180910390a17f56c50cb367acaded29acac1360aca317f3cf42564d325d3db565692c381f0f1181612aed90614f44565b604051612afa9190613588565b60405180910390a17f2991b83f6c9ae4df4119d0e4a7619f497d245d6c90d4b8ccd9a91ca242fd81a081612b2d90614fab565b604051612b3a91906135a3565b60405180910390a17f8d7827e5807ca8e7057274e877ccd878345813c5e38f86762ef963635182c98f81612b6d90615012565b604051612b7a91906135be565b60405180910390a17f4547dc0708632cbee3101392926d0e331b8e06a42ccfe7229f845d71a3e927bf81612bad90615079565b604051612bba91906135d9565b60405180910390a17fec8a7c0ac418c7d30cda3b44e091c2d2f6915344d6321d9eff166db9f60bcf1b81612bed906150e0565b604051612bfa91906135f4565b60405180910390a17f4a48834577f576fd1016cf65be5d1a3e316a8cc9d1db1821b7c225056729c9d581612c2d90615147565b604051612c3a919061360f565b60405180910390a17f0353d3234760658b04facb4296df6fc3fc968f60972807abd801269724e3f8dc81612c6d906151ae565b604051612c7a919061362a565b60405180910390a17fcf54bebce27f1b93470fbe2f40dc939bc3d77af699c84b133bfc1df8671d9f6481612cad9061527c565b604051612cba9190613660565b60405180910390a17f200ff370b668f478081863ff355f75204713d29ce42840aa655871d22421407a81612ced906152e3565b604051612cfa919061367b565b60405180910390a17f60cbabd0adedeb7f4dc41024a3bef125a9991d9ffd0f3b991ee3d1e47c4f821081612d2d9061534a565b604051612d3a9190613696565b60405180910390a17f3d122886b19e2e552decf3cefc4e3d84c610a48693b6c86548984c27db8aa04781604051612d71919061376e565b60405180910390a150565b6000612d8f612d8a84613e75565b613e50565b905082815260208101848484011115612dab57612daa615962565b5b612db684828561561b565b509392505050565b600082601f830112612dd357612dd261595d565b5b8135612de3848260208601612d7c565b91505092915050565b600060208284031215612e0257612e0161596c565b5b600082013567ffffffffffffffff811115612e2057612e1f615967565b5b612e2c84828501612dbe565b91505092915050565b612e3e81613efe565b82525050565b612e4d81613f2a565b82525050565b612e5c81613f56565b82525050565b612e6b81613f82565b82525050565b612e7a81613fae565b82525050565b612e8981613fda565b82525050565b612e9881614006565b82525050565b612ea781614032565b82525050565b612eb68161405e565b82525050565b612ec58161408a565b82525050565b612ed481613ed2565b82525050565b612ee3816140e2565b82525050565b612ef28161410e565b82525050565b612f018161413a565b82525050565b612f1081614166565b82525050565b612f1f81614192565b82525050565b612f2e816141be565b82525050565b612f3d816141ea565b82525050565b612f4c81614216565b82525050565b612f5b81614242565b82525050565b612f6a8161426e565b82525050565b612f79816140b6565b82525050565b612f88816142c6565b82525050565b612f97816142f2565b82525050565b612fa68161431e565b82525050565b612fb58161429a565b82525050565b612fc481614328565b82525050565b612fd381614354565b82525050565b612fe281614380565b82525050565b612ff1816143ac565b82525050565b613000816143d8565b82525050565b61300f81614404565b82525050565b600061302082613eb6565b61302a8185613ec1565b935061303a81856020860161562a565b61304381615971565b840191505092915050565b61305781614430565b82525050565b6130668161443d565b82525050565b6130758161444a565b82525050565b61308481614457565b82525050565b61309381614464565b82525050565b6130a281614471565b82525050565b6130b18161447e565b82525050565b6130c081614498565b82525050565b6130cf816144a5565b82525050565b6130de8161448b565b82525050565b6130ed816144b2565b82525050565b6130fc816144bf565b82525050565b61310b816144cc565b82525050565b61311a816144d9565b82525050565b613129816144e6565b82525050565b613138816144f3565b82525050565b61314781614500565b82525050565b6131568161450d565b82525050565b61316581614527565b82525050565b61317481614534565b82525050565b6131838161451a565b82525050565b61319281614541565b82525050565b6131a18161454b565b82525050565b6131b081614558565b82525050565b6131bf81614565565b82525050565b6131ce81614572565b82525050565b6131dd8161457f565b82525050565b6131ec8161458c565b82525050565b6131fb816145a6565b82525050565b61320a816145b3565b82525050565b61321981614599565b82525050565b613228816145c0565b82525050565b613237816145cd565b82525050565b613246816145e6565b82525050565b61325581614600565b82525050565b6132648161461b565b82525050565b61327381614637565b82525050565b61328281614654565b82525050565b61329181614672565b82525050565b6132a08161469f565b82525050565b6132af816146bf565b82525050565b6132be81614691565b82525050565b6132cd816146e0565b82525050565b6132dc81614702565b82525050565b6132eb81614725565b82525050565b6132fa81614749565b82525050565b6133098161476e565b82525050565b61331881614794565b82525050565b613327816147bb565b82525050565b613336816147e3565b82525050565b6133458161481b565b82525050565b61335481614845565b82525050565b6133638161480c565b82525050565b61337281614870565b82525050565b6133818161487a565b82525050565b6133908161488a565b82525050565b61339f8161489b565b82525050565b6133ae816148ad565b82525050565b6133bd816148c0565b82525050565b6133cc816148d4565b82525050565b6133db816148f6565b82525050565b6133ea8161490c565b82525050565b6133f9816148e9565b82525050565b61340881614923565b82525050565b60006020820190506134236000830184612e35565b92915050565b600060208201905061343e6000830184612e44565b92915050565b60006020820190506134596000830184612e53565b92915050565b60006020820190506134746000830184612e62565b92915050565b600060208201905061348f6000830184612e71565b92915050565b60006020820190506134aa6000830184612e80565b92915050565b60006020820190506134c56000830184612e8f565b92915050565b60006020820190506134e06000830184612e9e565b92915050565b60006020820190506134fb6000830184612ead565b92915050565b60006020820190506135166000830184612ebc565b92915050565b60006020820190506135316000830184612ecb565b92915050565b600060208201905061354c6000830184612eda565b92915050565b60006020820190506135676000830184612ee9565b92915050565b60006020820190506135826000830184612ef8565b92915050565b600060208201905061359d6000830184612f07565b92915050565b60006020820190506135b86000830184612f16565b92915050565b60006020820190506135d36000830184612f25565b92915050565b60006020820190506135ee6000830184612f34565b92915050565b60006020820190506136096000830184612f43565b92915050565b60006020820190506136246000830184612f52565b92915050565b600060208201905061363f6000830184612f61565b92915050565b600060208201905061365a6000830184612f70565b92915050565b60006020820190506136756000830184612f7f565b92915050565b60006020820190506136906000830184612f8e565b92915050565b60006020820190506136ab6000830184612f9d565b92915050565b60006020820190506136c66000830184612fac565b92915050565b60006020820190506136e16000830184612fbb565b92915050565b60006020820190506136fc6000830184612fca565b92915050565b60006020820190506137176000830184612fd9565b92915050565b60006020820190506137326000830184612fe8565b92915050565b600060208201905061374d6000830184612ff7565b92915050565b60006020820190506137686000830184613006565b92915050565b600060208201905081810360008301526137888184613015565b905092915050565b60006020820190506137a5600083018461304e565b92915050565b60006020820190506137c0600083018461305d565b92915050565b60006020820190506137db600083018461306c565b92915050565b60006020820190506137f6600083018461307b565b92915050565b6000602082019050613811600083018461308a565b92915050565b600060208201905061382c6000830184613099565b92915050565b600060208201905061384760008301846130a8565b92915050565b600060208201905061386260008301846130b7565b92915050565b600060208201905061387d60008301846130c6565b92915050565b600060208201905061389860008301846130d5565b92915050565b60006020820190506138b360008301846130e4565b92915050565b60006020820190506138ce60008301846130f3565b92915050565b60006020820190506138e96000830184613102565b92915050565b60006020820190506139046000830184613111565b92915050565b600060208201905061391f6000830184613120565b92915050565b600060208201905061393a600083018461312f565b92915050565b6000602082019050613955600083018461313e565b92915050565b6000602082019050613970600083018461314d565b92915050565b600060208201905061398b600083018461315c565b92915050565b60006020820190506139a6600083018461316b565b92915050565b60006020820190506139c1600083018461317a565b92915050565b60006020820190506139dc6000830184613189565b92915050565b60006020820190506139f76000830184613198565b92915050565b6000602082019050613a1260008301846131a7565b92915050565b6000602082019050613a2d60008301846131b6565b92915050565b6000602082019050613a4860008301846131c5565b92915050565b6000602082019050613a6360008301846131d4565b92915050565b6000602082019050613a7e60008301846131e3565b92915050565b6000602082019050613a9960008301846131f2565b92915050565b6000602082019050613ab46000830184613201565b92915050565b6000602082019050613acf6000830184613210565b92915050565b6000602082019050613aea600083018461321f565b92915050565b6000602082019050613b05600083018461322e565b92915050565b6000602082019050613b20600083018461323d565b92915050565b6000602082019050613b3b600083018461324c565b92915050565b6000602082019050613b56600083018461325b565b92915050565b6000602082019050613b71600083018461326a565b92915050565b6000602082019050613b8c6000830184613279565b92915050565b6000602082019050613ba76000830184613288565b92915050565b6000602082019050613bc26000830184613297565b92915050565b6000602082019050613bdd60008301846132a6565b92915050565b6000602082019050613bf860008301846132b5565b92915050565b6000602082019050613c1360008301846132c4565b92915050565b6000602082019050613c2e60008301846132d3565b92915050565b6000602082019050613c4960008301846132e2565b92915050565b6000602082019050613c6460008301846132f1565b92915050565b6000602082019050613c7f6000830184613300565b92915050565b6000602082019050613c9a600083018461330f565b92915050565b6000602082019050613cb5600083018461331e565b92915050565b6000602082019050613cd0600083018461332d565b92915050565b6000602082019050613ceb600083018461333c565b92915050565b6000602082019050613d06600083018461334b565b92915050565b6000602082019050613d21600083018461335a565b92915050565b6000602082019050613d3c6000830184613369565b92915050565b6000602082019050613d576000830184613378565b92915050565b6000602082019050613d726000830184613387565b92915050565b6000602082019050613d8d6000830184613396565b92915050565b6000602082019050613da860008301846133a5565b92915050565b6000602082019050613dc360008301846133b4565b92915050565b6000602082019050613dde60008301846133c3565b92915050565b6000602082019050613df960008301846133d2565b92915050565b6000602082019050613e1460008301846133e1565b92915050565b6000602082019050613e2f60008301846133f0565b92915050565b6000602082019050613e4a60008301846133ff565b92915050565b6000613e5a613e6b565b9050613e66828261565d565b919050565b6000604051905090565b600067ffffffffffffffff821115613e9057613e8f61568e565b5b613e9982615971565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b60007fffffffffffffffffffff0000000000000000000000000000000000000000000082169050919050565b60007fffffffffffffffffffffff00000000000000000000000000000000000000000082169050919050565b60007fffffffffffffffffffffffff000000000000000000000000000000000000000082169050919050565b60007fffffffffffffffffffffffffff0000000000000000000000000000000000000082169050919050565b60007fffffffffffffffffffffffffffff00000000000000000000000000000000000082169050919050565b60007fffffffffffffffffffffffffffffff000000000000000000000000000000000082169050919050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b60007fffffffffffffffffffffffffffffffffff00000000000000000000000000000082169050919050565b60007fffffffffffffffffffffffffffffffffffff000000000000000000000000000082169050919050565b60007fffffffffffffffffffffffffffffffffffffff0000000000000000000000000082169050919050565b60007fffff00000000000000000000000000000000000000000000000000000000000082169050919050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b60007fffffffffffffffffffffffffffffffffffffffffff000000000000000000000082169050919050565b60007fffffffffffffffffffffffffffffffffffffffffffff0000000000000000000082169050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffff00000000000000000082169050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000082169050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000082169050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000082169050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000082169050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000082169050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000082169050919050565b60007fffffff000000000000000000000000000000000000000000000000000000000082169050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000082169050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082169050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60007fffffffffff00000000000000000000000000000000000000000000000000000082169050919050565b60007fffffffffffff000000000000000000000000000000000000000000000000000082169050919050565b60007fffffffffffffff0000000000000000000000000000000000000000000000000082169050919050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b60007fffffffffffffffffff000000000000000000000000000000000000000000000082169050919050565b600081600c0b9050919050565b600081600d0b9050919050565b600081600e0b9050919050565b600081600f0b9050919050565b60008160100b9050919050565b60008160110b9050919050565b60008160120b9050919050565b60008160010b9050919050565b60008160130b9050919050565b60008160140b9050919050565b60008160150b9050919050565b60008160160b9050919050565b60008160170b9050919050565b60008160180b9050919050565b60008160190b9050919050565b600081601a0b9050919050565b600081601b0b9050919050565b600081601c0b9050919050565b60008160020b9050919050565b600081601d0b9050919050565b600081601e0b9050919050565b6000819050919050565b60008160030b9050919050565b60008160040b9050919050565b60008160050b9050919050565b60008160060b9050919050565b60008160070b9050919050565b60008160080b9050919050565b60008160000b9050919050565b60008160090b9050919050565b600081600a0b9050919050565b600081600b0b9050919050565b60006cffffffffffffffffffffffffff82169050919050565b60006dffffffffffffffffffffffffffff82169050919050565b60006effffffffffffffffffffffffffffff82169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600070ffffffffffffffffffffffffffffffffff82169050919050565b600071ffffffffffffffffffffffffffffffffffff82169050919050565b600072ffffffffffffffffffffffffffffffffffffff82169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600074ffffffffffffffffffffffffffffffffffffffffff82169050919050565b600075ffffffffffffffffffffffffffffffffffffffffffff82169050919050565b600076ffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b600078ffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b600079ffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b60007affffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b60007cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b60007dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b60007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600064ffffffffff82169050919050565b600065ffffffffffff82169050919050565b600066ffffffffffffff82169050919050565b600067ffffffffffffffff82169050919050565b600068ffffffffffffffffff82169050919050565b600060ff82169050919050565b600069ffffffffffffffffffff82169050919050565b60006affffffffffffffffffffff82169050919050565b60006bffffffffffffffffffffffff82169050919050565b600061494682613eb6565b8261495084613ea6565b905061495b816156bd565b9250600182101561499b576149967fff0000000000000000000000000000000000000000000000000000000000000083600103600802615982565b831692505b5050919050565b60006149ad82613eb6565b826149b784613ea6565b90506149c2816156d2565b9250600a821015614a02576149fd7fffffffffffffffffffff0000000000000000000000000000000000000000000083600a03600802615982565b831692505b5050919050565b6000614a1482613eb6565b82614a1e84613ea6565b9050614a29816156e7565b9250600b821015614a6957614a647fffffffffffffffffffffff00000000000000000000000000000000000000000083600b03600802615982565b831692505b5050919050565b6000614a7b82613eb6565b82614a8584613ea6565b9050614a90816156fc565b9250600c821015614ad057614acb7fffffffffffffffffffffffff000000000000000000000000000000000000000083600c03600802615982565b831692505b5050919050565b6000614ae282613eb6565b82614aec84613ea6565b9050614af781615711565b9250600d821015614b3757614b327fffffffffffffffffffffffffff0000000000000000000000000000000000000083600d03600802615982565b831692505b5050919050565b6000614b4982613eb6565b82614b5384613ea6565b9050614b5e81615726565b9250600e821015614b9e57614b997fffffffffffffffffffffffffffff00000000000000000000000000000000000083600e03600802615982565b831692505b5050919050565b6000614bb082613eb6565b82614bba84613ea6565b9050614bc58161573b565b9250600f821015614c0557614c007fffffffffffffffffffffffffffffff000000000000000000000000000000000083600f03600802615982565b831692505b5050919050565b6000614c1782613eb6565b82614c2184613ea6565b9050614c2c81615750565b92506010821015614c6c57614c677fffffffffffffffffffffffffffffffff0000000000000000000000000000000083601003600802615982565b831692505b5050919050565b6000614c7e82613eb6565b82614c8884613ea6565b9050614c9381615765565b92506011821015614cd357614cce7fffffffffffffffffffffffffffffffffff00000000000000000000000000000083601103600802615982565b831692505b5050919050565b6000614ce582613eb6565b82614cef84613ea6565b9050614cfa8161577a565b92506012821015614d3a57614d357fffffffffffffffffffffffffffffffffffff000000000000000000000000000083601203600802615982565b831692505b5050919050565b6000614d4c82613eb6565b82614d5684613ea6565b9050614d618161578f565b92506013821015614da157614d9c7fffffffffffffffffffffffffffffffffffffff0000000000000000000000000083601303600802615982565b831692505b5050919050565b6000614db382613eb6565b82614dbd84613ea6565b9050614dc8816157a4565b92506002821015614e0857614e037fffff00000000000000000000000000000000000000000000000000000000000083600203600802615982565b831692505b5050919050565b6000614e1a82613eb6565b82614e2484613ea6565b9050614e2f816157b9565b92506014821015614e6f57614e6a7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000083601403600802615982565b831692505b5050919050565b6000614e8182613eb6565b82614e8b84613ea6565b9050614e96816157ce565b92506015821015614ed657614ed17fffffffffffffffffffffffffffffffffffffffffff000000000000000000000083601503600802615982565b831692505b5050919050565b6000614ee882613eb6565b82614ef284613ea6565b9050614efd816157e3565b92506016821015614f3d57614f387fffffffffffffffffffffffffffffffffffffffffffff0000000000000000000083601603600802615982565b831692505b5050919050565b6000614f4f82613eb6565b82614f5984613ea6565b9050614f64816157f8565b92506017821015614fa457614f9f7fffffffffffffffffffffffffffffffffffffffffffffff00000000000000000083601703600802615982565b831692505b5050919050565b6000614fb682613eb6565b82614fc084613ea6565b9050614fcb8161580d565b9250601882101561500b576150067fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000083601803600802615982565b831692505b5050919050565b600061501d82613eb6565b8261502784613ea6565b905061503281615822565b925060198210156150725761506d7fffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000083601903600802615982565b831692505b5050919050565b600061508482613eb6565b8261508e84613ea6565b905061509981615837565b9250601a8210156150d9576150d47fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000083601a03600802615982565b831692505b5050919050565b60006150eb82613eb6565b826150f584613ea6565b90506151008161584c565b9250601b8210156151405761513b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000083601b03600802615982565b831692505b5050919050565b600061515282613eb6565b8261515c84613ea6565b905061516781615861565b9250601c8210156151a7576151a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000083601c03600802615982565b831692505b5050919050565b60006151b982613eb6565b826151c384613ea6565b90506151ce81615876565b9250601d82101561520e576152097fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000083601d03600802615982565b831692505b5050919050565b600061522082613eb6565b8261522a84613ea6565b90506152358161588b565b92506003821015615275576152707fffffff000000000000000000000000000000000000000000000000000000000083600303600802615982565b831692505b5050919050565b600061528782613eb6565b8261529184613ea6565b905061529c816158a0565b9250601e8210156152dc576152d77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000083601e03600802615982565b831692505b5050919050565b60006152ee82613eb6565b826152f884613ea6565b9050615303816158b5565b9250601f8210156153435761533e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083601f03600802615982565b831692505b5050919050565b600061535582613eb6565b8261535f84613ea6565b905061536a816158ca565b925060208210156153aa576153a57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802615982565b831692505b5050919050565b60006153bc82613eb6565b826153c684613ea6565b90506153d1816158df565b925060048210156154115761540c7fffffffff0000000000000000000000000000000000000000000000000000000083600403600802615982565b831692505b5050919050565b600061542382613eb6565b8261542d84613ea6565b9050615438816158f4565b92506005821015615478576154737fffffffffff00000000000000000000000000000000000000000000000000000083600503600802615982565b831692505b5050919050565b600061548a82613eb6565b8261549484613ea6565b905061549f81615909565b925060068210156154df576154da7fffffffffffff000000000000000000000000000000000000000000000000000083600603600802615982565b831692505b5050919050565b60006154f182613eb6565b826154fb84613ea6565b90506155068161591e565b92506007821015615546576155417fffffffffffffff0000000000000000000000000000000000000000000000000083600703600802615982565b831692505b5050919050565b600061555882613eb6565b8261556284613ea6565b905061556d81615933565b925060088210156155ad576155a87fffffffffffffffff00000000000000000000000000000000000000000000000083600803600802615982565b831692505b5050919050565b60006155bf82613eb6565b826155c984613ea6565b90506155d481615948565b925060098210156156145761560f7fffffffffffffffffff000000000000000000000000000000000000000000000083600903600802615982565b831692505b5050919050565b82818337600083830152505050565b60005b8381101561564857808201518184015260208101905061562d565b83811115615657576000848401525b50505050565b61566682615971565b810181811067ffffffffffffffff821117156156855761568461568e565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006156c98251613ed2565b80915050919050565b60006156de8251613efe565b80915050919050565b60006156f38251613f2a565b80915050919050565b60006157088251613f56565b80915050919050565b600061571d8251613f82565b80915050919050565b60006157328251613fae565b80915050919050565b60006157478251613fda565b80915050919050565b600061575c8251614006565b80915050919050565b60006157718251614032565b80915050919050565b6000615786825161405e565b80915050919050565b600061579b825161408a565b80915050919050565b60006157b082516140b6565b80915050919050565b60006157c582516140e2565b80915050919050565b60006157da825161410e565b80915050919050565b60006157ef825161413a565b80915050919050565b60006158048251614166565b80915050919050565b60006158198251614192565b80915050919050565b600061582e82516141be565b80915050919050565b600061584382516141ea565b80915050919050565b60006158588251614216565b80915050919050565b600061586d8251614242565b80915050919050565b6000615882825161426e565b80915050919050565b6000615897825161429a565b80915050919050565b60006158ac82516142c6565b80915050919050565b60006158c182516142f2565b80915050919050565b60006158d6825161431e565b80915050919050565b60006158eb8251614328565b80915050919050565b60006159008251614354565b80915050919050565b60006159158251614380565b80915050919050565b600061592a82516143ac565b80915050919050565b600061593f82516143d8565b80915050919050565b60006159548251614404565b80915050919050565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b600082821b90509291505056fea2646970667358221220392470399a9d621890e80cb746ed5966370d2748a25811bbe33b0ecf649bbfe064736f6c63430008060033"
}]);
}catch (e){
console.log(e.toString())
}
}
begin blkNum: 79681
end blkNum: 79684
=====eth_getFilterChanges==========
blockNumber: 79684 blkIdx: 0x10 logIndex: 0x4
blockNumber: 79684 blkIdx: 0x10 logIndex: 0x3
blockNumber: 79684 blkIdx: 0x10 logIndex: 0x2
blockNumber: 79684 blkIdx: 0x10 logIndex: 0x1
blockNumber: 79684 blkIdx: 0x10 logIndex: 0x0
blockNumber: 79684 blkIdx: 0xf logIndex: 0x4
blockNumber: 79684 blkIdx: 0xf logIndex: 0x3
blockNumber: 79684 blkIdx: 0xf logIndex: 0x2
blockNumber: 79684 blkIdx: 0xf logIndex: 0x1
blockNumber: 79684 blkIdx: 0xf logIndex: 0x0
blockNumber: 79684 blkIdx: 0xe logIndex: 0x4
blockNumber: 79684 blkIdx: 0xe logIndex: 0x3
blockNumber: 79684 blkIdx: 0xe logIndex: 0x2
blockNumber: 79684 blkIdx: 0xe logIndex: 0x1
blockNumber: 79684 blkIdx: 0xe logIndex: 0x0
blockNumber: 79684 blkIdx: 0xd logIndex: 0x0
blockNumber: 79684 blkIdx: 0xc logIndex: 0x4
blockNumber: 79684 blkIdx: 0xc logIndex: 0x3
blockNumber: 79684 blkIdx: 0xc logIndex: 0x2
blockNumber: 79684 blkIdx: 0xc logIndex: 0x1
blockNumber: 79684 blkIdx: 0xc logIndex: 0x0
blockNumber: 79684 blkIdx: 0xb logIndex: 0x0
blockNumber: 79684 blkIdx: 0xa logIndex: 0x4
blockNumber: 79684 blkIdx: 0xa logIndex: 0x3
blockNumber: 79684 blkIdx: 0xa logIndex: 0x2
blockNumber: 79684 blkIdx: 0xa logIndex: 0x1
blockNumber: 79684 blkIdx: 0xa logIndex: 0x0
blockNumber: 79684 blkIdx: 0x9 logIndex: 0x4
blockNumber: 79684 blkIdx: 0x9 logIndex: 0x3
blockNumber: 79684 blkIdx: 0x9 logIndex: 0x2
blockNumber: 79684 blkIdx: 0x9 logIndex: 0x1
blockNumber: 79684 blkIdx: 0x9 logIndex: 0x0
blockNumber: 79684 blkIdx: 0x8 logIndex: 0x0
blockNumber: 79684 blkIdx: 0x7 logIndex: 0x4
blockNumber: 79684 blkIdx: 0x7 logIndex: 0x3
blockNumber: 79684 blkIdx: 0x7 logIndex: 0x2
blockNumber: 79684 blkIdx: 0x7 logIndex: 0x1
blockNumber: 79684 blkIdx: 0x7 logIndex: 0x0
blockNumber: 79684 blkIdx: 0x6 logIndex: 0x0
blockNumber: 79684 blkIdx: 0x5 logIndex: 0x4
blockNumber: 79684 blkIdx: 0x5 logIndex: 0x3
blockNumber: 79684 blkIdx: 0x5 logIndex: 0x2
blockNumber: 79684 blkIdx: 0x5 logIndex: 0x1
blockNumber: 79684 blkIdx: 0x5 logIndex: 0x0
blockNumber: 79684 blkIdx: 0x4 logIndex: 0x4
blockNumber: 79684 blkIdx: 0x4 logIndex: 0x3
blockNumber: 79684 blkIdx: 0x4 logIndex: 0x2
blockNumber: 79684 blkIdx: 0x4 logIndex: 0x1
blockNumber: 79684 blkIdx: 0x4 logIndex: 0x0
blockNumber: 79684 blkIdx: 0x2 logIndex: 0x4
blockNumber: 79684 blkIdx: 0x2 logIndex: 0x3
blockNumber: 79684 blkIdx: 0x2 logIndex: 0x2
blockNumber: 79684 blkIdx: 0x2 logIndex: 0x1
blockNumber: 79684 blkIdx: 0x2 logIndex: 0x0
blockNumber: 79684 blkIdx: 0x0 logIndex: 0x4
blockNumber: 79684 blkIdx: 0x0 logIndex: 0x3
blockNumber: 79684 blkIdx: 0x0 logIndex: 0x2
blockNumber: 79684 blkIdx: 0x0 logIndex: 0x1
blockNumber: 79684 blkIdx: 0x0 logIndex: 0x0
begin blkNum: 0
end blkNum: 3
=====eth_getFilterChanges==========
blockNumber: 1 blkIdx: 0x0 logIndex: 0x0
blockNumber: 1 blkIdx: 0x0 logIndex: 0x1
blockNumber: 1 blkIdx: 0x0 logIndex: 0x2
blockNumber: 1 blkIdx: 0x0 logIndex: 0x3
blockNumber: 1 blkIdx: 0x0 logIndex: 0x4
blockNumber: 2 blkIdx: 0x0 logIndex: 0x0
blockNumber: 2 blkIdx: 0x0 logIndex: 0x1
blockNumber: 2 blkIdx: 0x0 logIndex: 0x2
blockNumber: 2 blkIdx: 0x0 logIndex: 0x3
blockNumber: 2 blkIdx: 0x0 logIndex: 0x4
blockNumber: 3 blkIdx: 0x0 logIndex: 0x0
blockNumber: 3 blkIdx: 0x0 logIndex: 0x1
blockNumber: 3 blkIdx: 0x0 logIndex: 0x2
blockNumber: 3 blkIdx: 0x0 logIndex: 0x3
blockNumber: 3 blkIdx: 0x0 logIndex: 0x4
begin blkNum: 18355459
end blkNum: 18355462
=====eth_getFilterChanges==========
blockNumber: 18355460 blkIdx: 0x0 logIndex: 0x0
blockNumber: 18355460 blkIdx: 0x0 logIndex: 0x1
blockNumber: 18355460 blkIdx: 0x1 logIndex: 0x2
blockNumber: 18355460 blkIdx: 0x1 logIndex: 0x3
blockNumber: 18355460 blkIdx: 0x1 logIndex: 0x4
blockNumber: 18355460 blkIdx: 0x1 logIndex: 0x5
blockNumber: 18355460 blkIdx: 0x2 logIndex: 0x6
blockNumber: 18355460 blkIdx: 0x2 logIndex: 0x7
blockNumber: 18355460 blkIdx: 0x3 logIndex: 0x8
blockNumber: 18355460 blkIdx: 0x3 logIndex: 0x9
blockNumber: 18355460 blkIdx: 0x3 logIndex: 0xa
blockNumber: 18355460 blkIdx: 0x3 logIndex: 0xb
blockNumber: 18355460 blkIdx: 0x3 logIndex: 0xc
blockNumber: 18355460 blkIdx: 0x3 logIndex: 0xd
blockNumber: 18355460 blkIdx: 0x3 logIndex: 0xe
blockNumber: 18355460 blkIdx: 0x3 logIndex: 0xf
blockNumber: 18355460 blkIdx: 0x5 logIndex: 0x10
blockNumber: 18355460 blkIdx: 0x6 logIndex: 0x11
blockNumber: 18355460 blkIdx: 0x6 logIndex: 0x12
blockNumber: 18355460 blkIdx: 0x7 logIndex: 0x13
blockNumber: 18355460 blkIdx: 0x8 logIndex: 0x14
blockNumber: 18355460 blkIdx: 0xb logIndex: 0x15
blockNumber: 18355460 blkIdx: 0xb logIndex: 0x16
blockNumber: 18355460 blkIdx: 0xd logIndex: 0x17
blockNumber: 18355460 blkIdx: 0xd logIndex: 0x18
blockNumber: 18355460 blkIdx: 0xd logIndex: 0x19
blockNumber: 18355460 blkIdx: 0xd logIndex: 0x1a
blockNumber: 18355460 blkIdx: 0xd logIndex: 0x1b
blockNumber: 18355460 blkIdx: 0xe logIndex: 0x1c
blockNumber: 18355460 blkIdx: 0xe logIndex: 0x1d
blockNumber: 18355460 blkIdx: 0xe logIndex: 0x1e
blockNumber: 18355460 blkIdx: 0xe logIndex: 0x1f
blockNumber: 18355460 blkIdx: 0xe logIndex: 0x20
blockNumber: 18355460 blkIdx: 0xe logIndex: 0x21
blockNumber: 18355460 blkIdx: 0xe logIndex: 0x22
blockNumber: 18355460 blkIdx: 0xf logIndex: 0x23
blockNumber: 18355460 blkIdx: 0xf logIndex: 0x24
blockNumber: 18355460 blkIdx: 0x10 logIndex: 0x25
blockNumber: 18355460 blkIdx: 0x10 logIndex: 0x26
blockNumber: 18355461 blkIdx: 0x1 logIndex: 0x0
blockNumber: 18355461 blkIdx: 0x2 logIndex: 0x1
blockNumber: 18355461 blkIdx: 0x2 logIndex: 0x2
blockNumber: 18355461 blkIdx: 0x2 logIndex: 0x3
blockNumber: 18355461 blkIdx: 0x2 logIndex: 0x4
blockNumber: 18355461 blkIdx: 0x2 logIndex: 0x5
blockNumber: 18355461 blkIdx: 0x2 logIndex: 0x6
blockNumber: 18355461 blkIdx: 0x4 logIndex: 0x7
blockNumber: 18355461 blkIdx: 0x4 logIndex: 0x8
blockNumber: 18355461 blkIdx: 0x4 logIndex: 0x9
blockNumber: 18355461 blkIdx: 0x6 logIndex: 0xa
blockNumber: 18355461 blkIdx: 0x9 logIndex: 0xb
blockNumber: 18355461 blkIdx: 0xa logIndex: 0xc
blockNumber: 18355461 blkIdx: 0xb logIndex: 0xd
blockNumber: 18355461 blkIdx: 0xb logIndex: 0xe
blockNumber: 18355462 blkIdx: 0x0 logIndex: 0x0
blockNumber: 18355462 blkIdx: 0x1 logIndex: 0x1
blockNumber: 18355462 blkIdx: 0x4 logIndex: 0x2
blockNumber: 18355462 blkIdx: 0x4 logIndex: 0x3
blockNumber: 18355462 blkIdx: 0x4 logIndex: 0x4
blockNumber: 18355462 blkIdx: 0x5 logIndex: 0x5
blockNumber: 18355462 blkIdx: 0x5 logIndex: 0x6
blockNumber: 18355462 blkIdx: 0x6 logIndex: 0x7
blockNumber: 18355462 blkIdx: 0x7 logIndex: 0x8
blockNumber: 18355462 blkIdx: 0x8 logIndex: 0x9
blockNumber: 18355462 blkIdx: 0x8 logIndex: 0xa
1. The log order should be the same as the hardhat
2. More than just the latest block log
I don't know how to parse the args.
``
curl https://godwoken-testnet-web3-v1-rpc.ckbapp.dev -X POST -H "Content-Type: application/json"
-d '{"jsonrpc":"2.0","method":"gw_get_transaction","params": ["0x718ef966e73ffa27a2c94ca7d0367d415b5ca4fbc94fc7ef137e25d9f7653639"],"id":1}'
`{"jsonrpc":"2.0","id":1,"result":{"transaction":{"raw":{"from_id":"0x2e8","to_id":"0x4","nonce":"0x3e","args":"0x020000004f2548c2e3e8776ec3fc272f69c18c866ea435d7cc7f53ef92550e7273d2a7920000000000000000"},"signature":"0x8a8faa8fc45e3669f0ab01a8ca63191ba3022cb94d45dc11e11f6672a86ebc4a071f06e1b657408ab6e92986b558f3451c126acf3d94d6389e604903566e88f201","hash":"0x718ef966e73ffa27a2c94ca7d0367d415b5ca4fbc94fc7ef137e25d9f7653639"},"status":"committed"}}% `
I was trying to fetch block info via eth_getBlockByHash
as follow
curl http://localhost:3000 -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params": ["0x0e8bd807e9f73520a71b12e97430a78127b3a646eeee91345eb4f9e8397774a3",false],"id":1}'
and the response was
{"jsonrpc":"2.0","id":1,"result":{"number":"0x3efce","hash":"0x0e8bd807e9f73520a71b12e97430a78127b3a646eeee91345eb4f9e8397774a3","parentHash":"0x9be8c5dea8287afe5e41eaafefda9406bacb4c1a2e0dec6b234a4eeb9d255181","gasLimit":"0xbebc20","gasUsed":"0x0","miner":"0x68f5cea51fa6fcfdcc10f6cddcafa13bf6717436","size":"0x144","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","transactions":[],"timestamp":"0x61f0e5cc","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","stateRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","sha3Uncles":"0x0000000000000000000000000000000000000000000000000000000000000000","receiptsRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionsRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","uncles":[],"difficulty":"0x8e1bc9bf04000","totalDifficulty":"0x8e1bc9bf04000","extraData":"0x"}}
There were two fields about difficulty
in the response, difficulty
and totalDifficulty
.
I was confused by them since they had the same value while they should have different values, totalDifficulty
should be an accumulation of difficulty
, now they seemed to be dummy values of 0x8e1bc9bf04000
I'd like to know why they are both 0x8e1bc9bf04000
and if they are meaningful.
Demo repository: https://github.com/DeadGamesInc/nervos-testing
Result:
"OblivionBasicNft" -- Cannot convert 0x-4 to a BigInt.
at C:\Users\barry\AppData\Roaming\npm\node_modules\truffle\build\webpack:\packages\deployer\src\deployment.js:365:1
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at Migration._deploy (C:\Users\barry\AppData\Roaming\npm\node_modules\truffle\build\webpack:\packages\migrate\Migration.js:75:1)
at Migration._load (C:\Users\barry\AppData\Roaming\npm\node_modules\truffle\build\webpack:\packages\migrate\Migration.js:61:1)
at Migration.run (C:\Users\barry\AppData\Roaming\npm\node_modules\truffle\build\webpack:\packages\migrate\Migration.js:218:1)
at Object.runMigrations (C:\Users\barry\AppData\Roaming\npm\node_modules\truffle\build\webpack:\packages\migrate\index.js:150:1)
at Object.runFrom (C:\Users\barry\AppData\Roaming\npm\node_modules\truffle\build\webpack:\packages\migrate\index.js:110:1)
at runMigrations (C:\Users\barry\AppData\Roaming\npm\node_modules\truffle\build\webpack:\packages\core\lib\commands\migrate.js:253:1)
at Object.run (C:\Users\barry\AppData\Roaming\npm\node_modules\truffle\build\webpack:\packages\core\lib\commands\migrate.js:223:1)
at Command.run (C:\Users\barry\AppData\Roaming\npm\node_modules\truffle\build\webpack:\packages\core\lib\command.js:167:1)
https://explorer.nervos.org/aggron/transaction/0xb8ca4914b92285d8f2b2ba7fa2a3a2ff7610f174623b5dc0e585917c7272f1b7 output index#2 is a withdrawal lock.
But args can't parse with https://github.com/nervosnetwork/godwoken/blob/90ecd3b58e1f25fe83ef74090e5bca83287ca2eb/crates/types/schemas/godwoken.mol#L196 molecule struct
Request:
curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"id":2145843671,"jsonrpc":"2.0","method":"eth_call","params":[{"to":"0x69ac4f2dd9b244bae7a725f3971e2907152ac6ab","data":"0x399542e90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001800000000000000000000000003f160092f4a833b70bc1bb76603dedc01bf02c790000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002470a08231000000000000000000000000d173313a51f8fc37bcf67569b463abd89d81844f0000000000000000000000000000000000000000000000000000000000000000000000000000000069ac4f2dd9b244bae7a725f3971e2907152ac6ab000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000040f28c97d0000000000000000000000000000000000000000000000000000000000000000000000000000000069ac4f2dd9b244bae7a725f3971e2907152ac6ab000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000244d2301cc000000000000000000000000d173313a51f8fc37bcf67569b463abd89d81844f00000000000000000000000000000000000000000000000000000000"},"0x31d5"]}' https://godwoken-testnet-web3-v1-rpc.ckbapp.dev
Result:
{"jsonrpc":"2.0","id":2145843671,"error":{"code":-32099,"message":"from id not found!"}}
Context: Trying to deploy SushiSwap interface on Godwoken Testnet v1.
env: https://godwoken-testnet-web3-v1-rpc.ckbapp.dev/
query illegal transaction's Receipt ,failed reason not fully displayed
eth_getTransactionReceipt
eth_call
responseeth_estimateGas
function testERCTransferFailed() public {
require(false, "ERC20: transfer amount exceeds balance");
}
jsonRpcRequest: {
jsonrpc: '2.0',
method: 'eth_getTransactionReceipt',
params: [
'0x6a5fe6b03b0b866ed7887f629433dacf35ab7b88557d89a60b6edd25396b2344'
],
id: 22
}
jsonRpcResponse: {
jsonrpc: '2.0',
id: 22,
result: {
transactionHash: '0x6a5fe6b03b0b866ed7887f629433dacf35ab7b88557d89a60b6edd25396b2344',
blockHash: '0xd8f8fe9d79c9b04e75a41f0606198b797356466cdaef42325791af45407f0d56',
blockNumber: '0x13dcf',
transactionIndex: '0x0',
gasUsed: '0xf26',
cumulativeGasUsed: '0xf26',
logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
logs: [],
contractAddress: null,
status: '0x0',
from: '0x0000000000000000000000000000000000000000',
to: null,
failed_reason: {
status_code: '0x2',
status_type: 'REVERT',
message: 'ERC20: transfer amount exceeds b'
}
}
}
jsonRpcRequest: {
jsonrpc: '2.0',
method: 'eth_estimateGas',
params: [
{
to: '0xdf02807eEBE70CeC5c3F81358702937024CFf9F8',
data: '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000041945df7b00000000000000000000000000000000000000000000000000000000',
from: '0x0c1efcca2bcb65a532274f3ef24c044ef4ab6d73'
},
'latest'
],
id: 17
}
jsonRpcResponse: { jsonrpc: '2.0', id: 17, result: '0xf26' }
jsonRpcRequest: {
jsonrpc: '2.0',
method: 'eth_call',
params: [
{
to: '0xd93A07eE498b45501C8079FEa8e774942787112A',
data: '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000041945df7b00000000000000000000000000000000000000000000000000000000',
from: '0x0c1efcca2bcb65a532274f3ef24c044ef4ab6d73'
},
'latest'
],
id: 17
}
jsonRpcResponse: {
jsonrpc: '2.0',
id: 17,
error: {
code: -32099,
message: 'revert: ERC20: transfer amount exceeds balance',
data: {"failed_reason":{"status_code":"0x2","status_type":"REVERT","message":"ERC20: transfer amount exceeds balance"}
}
}
Implementation of RPC interface:
// RPC interfaces accept string parameters
async function method(rawParam1: string, rawParam2: string) -> Promise<T> {
// Try to convert string types to core type
const param1 = await toParam1(rawParam1).catch((error)=> { return Promise(InvalidParam { index: 1, error }) });
// Use core types and return core types
const result: CoreResultType = do_something(param1);
const hexadecimalResult = result.toJsonValue();
return hexadecimalResult;
}
async function toParam1(raw: string) -> Promise<Param1> {
...
if <error detected> {
throw new Error(...)
}
return param1;
}
https://explorer.nervos.org/aggron/transaction/0xd4e2f997a9c6c7b8ab05fb43ba835e70919833954e31870891ae72000991b8a4
output index: 0 , we parse the args and get a script_hash is : 0x28fc0c5c7b7710c27a44812ab4fb383f83a8552414de40b6c055bb74710c8395
curl https://godwoken-testnet-web3-v1-rpc.ckbapp.dev -X POST -H "Content-Type: application/json" -d '{"jsonrpc": "2.0", "method":"gw_get_account_id_by_script_hash", "params": ["0x28fc0c5c7b7710c27a44812ab4fb383f83a8552414de40b6c055bb74710c8395"], "id": 1}'
{"jsonrpc":"2.0","id":1,"result":null}%
env: docker image: ghcr.io/nervosnetwork/godwoken-web3-prebuilds:compatibility-breaking-changes-1a52afb
solidity code:
function ass(uint256 b2, uint256 cc1, uint256 cc2) public view returns (bytes memory a, bytes memory b){
assembly {
a := mload(0x40)
b := add(a, b2)
codecopy(a, cc1, cc2)
}
}
invoke ass(33,4,32);
other blockchain return
0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040
error code:
[https://github.com/Dawn-githap/gw-hardhat-test.git](url)
error message:
11:40:11 0|gw-web3 | request.method: eth_call
11:40:11 0|gw-web3 | fromId: 2
11:40:11 0|gw-web3 | rawL2Transaction: {
11:40:11 0|gw-web3 | "from_id": "0x2",
11:40:11 0|gw-web3 | "to_id": "0x40",
11:40:11 0|gw-web3 | "nonce": "0x0",
11:40:11 0|gw-web3 | "args": "0xffffff504f4c59000000000100000000010000000000000000000000000000000000000000000000000000000000000004000000e08c3988"
11:40:11 0|gw-web3 | }
11:40:11 0|gw-web3 | Call gw rpc "gw_execute_raw_l2transaction" error: JSONRPCError: server error {"code":-32600,"message":"invalid exit code 50","data":{"tx_hash":"0xe17c2fe31c9d74a391237cd21f8fdca062a5c2f012cb3330f491b2d128222e27","block_number":"0x194","return_data":"0x","last_log":{"account_id":"0x40","service_flag":"0x2","data":"0x6a950100000000006a95010000000000000000000000000000000000000000000000000000000000"}}}
11:40:11 0|gw-web3 | [error] JSONRPC Server Error: [bound call] RpcError: success: RpcError: success:
11:40:11 0|gw-web3 | at Eth.call (/godwoken-web3/packages/api-server/lib/methods/modules/eth.js:331:19)
11:40:11 0|gw-web3 | at runMicrotasks ()
11:40:11 0|gw-web3 | at processTicksAndRejections (internal/process/task_queues.js:95:5)
11:40:11 0|gw-web3 | at async Eth.call (/godwoken-web3/packages/api-server/lib/methods/validator.js:28:20)
11:40:11 0|gw-web3 | at async Server.methods. (/godwoken-web3/packages/api-server/lib/methods/index.js:49:36)
we do need more docs and more friendly error message about not supporting old signing scheme before eip155.
Originally posted by @RetricSu in #238 (comment)
Can confirm some strange things here:
TxHash from contract interaction returns null
context:
const method =
deployedContractInst.methods.transfer(
'0x66452d81a51411F8d4CE1eeF004377eEB52bf65a',
10
)
const transaction = {
nonce: await web3.eth.getTransactionCount(account.address),
from: account.address,
gas: 1000000000000002,
gasPrice: '100',
to: method._parent._address,
data: method.encodeABI(),
}
// account - web3's Account (from private key)
const { rawTransaction } = await account.signTransaction(transaction)
const txReceipt = await web3.eth.sendSignedTransaction(rawTransaction)
{
"jsonrpc": "2.0",
"id": 17,
"method": "eth_sendRawTransaction",
"params": ["0xf8b68204606487038d7ea4c680029486e026e9a8b1cb2d64aeaba75547ab4c44b1f1c38405f5e100b844a9059cbb00000000000000000000000066452d81a51411f8d4ce1eef004377eeb52bf65a000000000000000000000000000000000000000000000000000000000000000a87062bb600000030a01939820fd0257795f5f44c3dce96c65013487c1cd2b5cea11088a7cbf903abfba0678647d4d04c83c62d043e5c4b3a1a9e8ac11f3deb9de14f6025c5ca0d33073d"]
}
{
"jsonrpc": "2.0",
"id": 17,
"result": "0x28ca43cba508d28b53e78b1342207d5e3b9d39553614ecd465314b84f54bc239"
}
gw_get_transaction_receipt also returns null
I'm expecting that all is fine because balanceOf(account.address) is gotten
Originally posted by @dxnght in #208 (comment)
curl -X POST --data '{"jsonrpc":"2.0","id":73,"method":"eth_call","params":[{"data":"0xdd62ed3e00000000000000000000000029b563951ed0eb9ae5c49692266e1fbc81445cfe000000000000000000000000c01d5b3170c9cd146ab8ccbc210ce39e2892f48c","from":"0x0000000000000000000000000000000000000000","to":"0x696f8499f7cafdba66582d619d628f86ee95e5ba"},"latest"]}
' https://godwoken-testnet-web3-v1-rpc.ckbapp.dev -H "Content-Type: application/json"
returns error:
{"jsonrpc":"2.0","id":73,"error":{"code":-32099,"message":"zero address 0x0000000000000000000000000000000000000000 has no valid account_id!"}}
However per the JSON-RPC spec the "from" address can be zero.
We use express
to implement JSONRPC server. I recently found sangaman/http-jsonrpc-server, a simple and lightweight JSONRPC server. It is also well-tested. So I want to use sangaman/http-jsonrpc-server to change express
for JSONRPC server.
Users can send a transaction with a particularly high gasLimit
env:https://godwoken-testnet-web3-v1-rpc.ckbapp.dev/
query tx
curl --location --request POST 'https://godwoken-testnet-web3-v1-rpc.ckbapp.dev/' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc":"2.0",
"method":"eth_getTransactionByHash",
"params":[
"0x8ff215fad0381271fd86af95a2ecb804e291ae798407feb92229351833513245"
],
"id":1
}'
tx's gasLimit is :0xffffffffff
{"jsonrpc":"2.0","id":1,"result":{"hash":"0x8ff215fad0381271fd86af95a2ecb804e291ae798407feb92229351833513245","blockHash":"0xf381633206f00645f550724c44c9c5be3ef8f348e6e217e7d57f5136c6ca15f3","blockNumber":"0x11259","transactionIndex":"0x0","from":"0x0c1efcca2bcb65a532274f3ef24c044ef4ab6d73","to":null,"gas":"0xffffffffff","gasPrice":"0x1","input":"0x6080604052348015600f57600080fd5b50604e80601d6000396000f3fe608060405236600a57005b348015601557600080fd5b5000fea2646970667358221220d7b4ccf3d12a6e7bab69e20026217bb626e44f1a748c2f3d13f3edab6054661b64736f6c634300060c0033","nonce":"0x1d1","value":"0x0","v":"0x0","r":"0x1dfeecf3184ba7a3ec705e8af2f11978cdc475f36615113fd6c0eb0b93abea1f","s":"0x686f0492323f09430b7419dea2c188832f4efc5d75057630b0c7650f0289932b"}}
expected: Failed to send transaction, like a hardhat: Transaction gas limit is 1099511627775 and exceeds block gas limit of 30000000
env:https://godwoken-testnet-web3-v1-rpc.ckbapp.dev/
code
const filterId = await ethers.provider.send("eth_newBlockFilter");
for (let i = 0; i < 5; i++) {
console.log("----------")
const txs = await ethers.provider.send("eth_getFilterChanges", [filterId]);
console.log("eth_getFilterChanges: ",i,":",txs.length)
}
----------
eth_getFilterChanges: 0 : 79301
----------
eth_getFilterChanges: 1 : 0
----------
eth_getFilterChanges: 2 : 0
----------
eth_getFilterChanges: 3 : 0
----------
eth_getFilterChanges: 4 : 0
----------
eth_getFilterChanges: 0 : 0
----------
eth_getFilterChanges: 1 : 0
----------
eth_getFilterChanges: 2 : 0
----------
eth_getFilterChanges: 3 : 0
----------
eth_getFilterChanges: 4 : 0
----------
eth_getFilterChanges: 0 : 0
----------
eth_getFilterChanges: 1 : 0
----------
eth_getFilterChanges: 2 : 0
----------
eth_getFilterChanges: 3 : 0
----------
eth_getFilterChanges: 4 : 0
----------
eth_getFilterChanges: 0 : 0
----------
eth_getFilterChanges: 1 : 0
----------
eth_getFilterChanges: 2 : 0
----------
eth_getFilterChanges: 3 : 1
----------
eth_getFilterChanges: 4 : 0
godwoken eth_getFilterChanges: 0 : 79301 => eth_getFilterChanges: 0 : 0
When i try to run this query on godwoken testnet v1
curl -v -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"],"fromBlock":"0x90b3","toBlock":"0x90b4"}],"id":74}' https://godwoken-testnet-web3-v1-rpc.ckbapp.dev/ | jq
I receive a event without topics. I shouldn't receive any events without topic if i put inside params a topic hash
Godwoken-web3 should add support for passing second argument to eth_getStorageAt with leading hex number zeros, eg. 0x01
. Ethereum node accepts such arguments. Godwoken-web3 throws error "invalid argument 1: hex number with leading zero digits".
The problem has been found while trying to deploy Gnosis Safe on Godwoken Testnet while running https://github.com/gnosis/safe-transaction-service. This issue results in critical error when trying to get deployed multisig wallet information:
worker_1 | 2022-01-23 13:19:41,160 [INFO] [a2d9a772/index_new_proxies_task] Task safe_transaction_service.history.tasks.index_new_proxies_task[a2d9a772-9c3e-42df-9d95-892ddb80ec98] succeeded in 0.7130728999982239s: 0
web_1 | 2022-01-23 13:19:41,467 [DEBUG] [MainProcess] Getting response HTTP. URI: http://godwoken-testnet-web3-rpc.ckbapp.dev, Method: eth_getStorageAt, Response: {'jsonrpc': '2.0', 'id': 4, 'error': {'code': -32602, 'message': 'invalid argument 1: hex number with leading zero digits'}}
web_1 | 2022-01-23 13:19:41,467 MT::GET::api/v1/safes/<str:address>/::711::422::/api/v1/safes/0x87C80d26CD4c8963BB963c69a224356f4138c4F4/
Related gnosis.py code: https://github.com/gnosis/gnosis-py/blob/3cba9a59a82b587478941ee80f4e0d431644bb45/gnosis/safe/safe.py#L912
Request:
curl --location --request POST 'https://rinkeby-light.eth.linkpool.io/' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "eth_getStorageAt",
"params": [
"0x74a3dbd5831f45CD0F3002Bb87a59B7C15b1B5E6",
"0x01",
"latest"
],
"id": 0
}'
Result:
{"jsonrpc":"2.0","id":0,"result":"0x0000000000000000000000000000000000000000000000000000000000000000"}
Request:
curl --location --request POST 'http://godwoken-testnet-web3-rpc.ckbapp.dev' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "eth_getStorageAt",
"params": [
"0x017644909870358fd2aFb96cfeB789978962A429",
"0x01",
"latest"
],
"id": 0
}'
Result:
{"jsonrpc":"2.0","id":0,"error":{"code":-32602,"message":"invalid argument 1: hex number with leading zero digits"}}
godwoken
curl -X POST --data '{"jsonrpc":"2.0", "method":"eth_newFilter", "params":[{"topics":["0x12341234"]}], "id":73}' https://godwoken-testnet-web3-v1-rpc.ckbapp.dev -H "Content-Type: application/json"
result
{"jsonrpc":"2.0","id":73,"error":{"code":-32602,"message":"invalid argument 0: invalid argument"}}
eth
{"jsonrpc":"2.0","id":73,"error":{"code":-32602,"message":"invalid argument 0: hex has invalid length 4 after decoding; expected 32 for topic"}}
When sending a transaction on Godwoken Testnet v1 that fails the transaction shows as "pending" in MetaMask and when you try to send another transaction it will give you problem about wrong nonce.
Because of this after failed transaction on Godwoken Testnet v1 MetaMask is stuck.
The workaround is to go to Settings > Advanced and click Reset Account in MetaMask.
I debugged MetaMask extension in Firefox and it seems after sending transaction:
Eg. it's sending such request:
{"id":7536123498664,"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["METAMASK_TX_HASH"]}
MetaMask frozen after sendRawTransaction with transaction that will revert:
Trying to send new transaction:
MetaMask - RPC Error: [ethjs-query] while formatting outputs from RPC '{"value":{"code":-32603,"data":{"code":-32602,"message":"JSONRPCError: server error {\"code\":-32001,\"message\":\"invalid nonce of account 181 expected 262, actual 263\"}"}}}'
sendRawTransaction calling "artificialRevert" method:
pragma solidity >=0.8.0;
contract SimpleStorage {
uint storedData;
constructor() payable {
storedData = 123;
}
function set(uint x) public payable {
storedData = x;
}
function get() public view returns (uint) {
return storedData;
}
function artificialRevert() public {
require(true == false, "artificial revert");
storedData = 777777;
}
}
MetaMask request on Godwoken Testnet v1:
{"id":844131868751,"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":["0xf86d82010601830f4240943f972ac67435ceb1304daaef77d97586eb7c54428084862d6eba87062bb60000002fa01ee7a2d1fa062686247578cb06146b5ad67810d5b2627d41e8e61bbdbc38b99ba06aece96800a91479b088fab5dab913033eeb523b067be79056ee5910c3685849"]}
response:
{"jsonrpc":"2.0","id":844131868751,"result":"0x7c943614e021a30e17b62053a6fd31aaa3eff1e00f4bd3262f3c1c5662375ded"}
Tx id of failing transaction can't be found on Godwoken Explorer: https://v1.aggron.gwscan.com/tx/0x7c943614e021a30e17b62053a6fd31aaa3eff1e00f4bd3262f3c1c5662375ded
MetaMask also can't find it, it's asking for transaction receipt but doesn't receive it. Request:
{"id":4337304758587,"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0x7c943614e021a30e17b62053a6fd31aaa3eff1e00f4bd3262f3c1c5662375ded"]}
Response:
{"jsonrpc":"2.0","id":4337304758587,"result":null}
Are failed transaction by design not included in Godwoken Chain and it means that this problem with MetaMask is permanent and we should recommend users to reset their accounts?
curl https://godwoken-testnet-web3-v1-rpc.ckbapp.dev -X POST -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params": ["0xf6cbd7ee5d8b8a3c4109729a3ec9044bb22703c6febc1dfe179a78e092ccd6bf"],"id":1}'
{"jsonrpc":"2.0","id":1,"result":null}%
updated:
I test some of txs's eth_getTransactioniReceipt rpc, and all of them return null
Currently, the infos form getChainInfo
RPC are not enough.
curl https://godwoken-testnet-web3-v1-rpc.ckbapp.dev -X POST -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"poly_getChainInfo","params": [],"id":1}'
"result": {
"rollupScriptHash": "0xfa3afe76deb7a9642831360df07c7a1483c96eb69b28501450b364cf8cb2ff2e",
"rollupConfigHash": null,
"ethAccountLockTypeHash": "0x6ac8027edfd86557a0b02fb8b9dce9ffc2bb2ac0b2f0352f74912bb546dc374c",
"polyjuiceContractTypeHash": "0x848753a2b16c63682c7de4e6cc7167890ff3f821d61328f45386d91ece54373e",
"polyjuiceCreatorId": "5",
"chainId": "868450977185797"
}
This issue is blocking subgraph (graph-node) use:
Request:
curl --location --request POST 'https://godwoken-testnet-web3-v1-rpc.ckbapp.dev' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "eth_getLogs",
"params": [
{
"fromBlock": "0x0",
"toBlock": "0x0",
"address": "0xe17c6fb261e01a6724b1465f08aab4ff415f96e3"
}
],
"id": 0
}'
Result (wrong):
{
"jsonrpc": "2.0",
"id": 0,
"error": {
"code": -32099,
"message": "invalid params!"
}
}
Request:
curl --location --request POST 'https://rinkeby-light.eth.linkpool.io' \
--header 'Content-Type: application/json' \
--header 'Cookie: AWSALB=e9Ib3fUnRPG5/yckPYuOEk85X9MeTR8lBNMVOISoLviqgR1jD+U41y99K4HVvZZO7IliCOv1ijWdp5m064jGDa9VDhM2j8reOzpUuNZ5HsVM9D5msRW/ffy/7jgX; AWSALBCORS=e9Ib3fUnRPG5/yckPYuOEk85X9MeTR8lBNMVOISoLviqgR1jD+U41y99K4HVvZZO7IliCOv1ijWdp5m064jGDa9VDhM2j8reOzpUuNZ5HsVM9D5msRW/ffy/7jgX' \
--data-raw '{
"jsonrpc": "2.0",
"method": "eth_getLogs",
"params": [
{
"fromBlock": "0x0",
"toBlock": "0x0",
"address": "0xe17c6fb261e01a6724b1465f08aab4ff415f96e3"
}
],
"id": 0
}'
Result (correct, no error):
{"jsonrpc":"2.0","id":0,"result":[]}
web3_1 | 15:28:41 0|gw-web3 | request.method: eth_call
web3_1 | 15:28:41 0|gw-web3 | fromId: 2
web3_1 | 15:28:41 0|gw-web3 | [error] JSONRPC Server Error: [bound call] RpcError: to id missing! RpcError: to id missing!
web3_1 | 15:28:41 0|gw-web3 | at Eth.call (/godwoken-web3/packages/api-server/lib/methods/modules/eth.js:331:19)
web3_1 | 15:28:41 0|gw-web3 | at processTicksAndRejections (internal/process/task_queues.js:95:5)
web3_1 | 15:28:41 0|gw-web3 | at async Eth.call (/godwoken-web3/packages/api-server/lib/methods/validator.js:28:20)
web3_1 | 15:28:41 0|gw-web3 | at async Server.methods.<computed> (/godwoken-web3/packages/api-server/lib/methods/index.js:49:36)
env: https://godwoken-testnet-web3-v1-rpc.ckbapp.dev/
test code
it("to has fallback func,data is 0x", async ()=>{
let contract = await fallbackAndReceiveContract.deploy();
await contract.deployed()
console.log("address:",contract.address)
let tx = await ethers.provider.send("eth_sendTransaction", [{
"to":contract.address,
"data": null,
}]);
let response = await getTxReceipt(ethers.provider, tx, 10)
console.log("response:",response)
}).timeout(50000)
> curl https://godwoken-testnet-web3-v1-rpc.ckbapp.dev/ -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params": ["0x0",false],"id":1}'
{"jsonrpc":"2.0","id":1,"error":{"code":-32603,"message":"Internal error"}}
Request
curl 'https://mainnet.godwoken.io/rpc' \
-H 'content-type: application/json' \
--data-raw '{"jsonrpc":"2.0","method":"eth_estimateGas","params":[{"to":"0xa2b619769edcaeb7feb19e214f2f6556ea61ca3f","from":"0x4b51bf8ed2c13d1104c0d22aa1c5c215d218b93b","value":"0x6fc23ac00","data":"0x"}],"id":1}'
Result:
{"jsonrpc":"2.0","id":1,"error":{"code":-32099,"message":"Cannot read property 'last_log' of undefined"}}
The RPC gw_execute_raw_l2transaction
returns error without error code for "to address is not a valid contract":
$ echo '{
"id": 2,
"jsonrpc": "2.0",
"method": "gw_execute_raw_l2transaction",
"params": ["0x5c00000014000000180000001c0000002000000004000000140000001300000038000000ffffff504f4c590000a0724e18090000000000000000000000000000000000000000000000000000000000000000000004000000d504ea1d"]
}' \
| tr -d '\n' \
| curl -H 'content-type: application/json' -d @- \
http://localhost:8024
{"jsonrpc":"2.0","id":2,"error":{"code":0,"message":"to address is not a valid contract."}}
account_script_hash_to_eth_address returns gw_short_script_hash
.
We should consider to refactor the account_script_hash_to_eth_address
method, and set miner_address to native_eth_address.
curl https://godwoken-testnet-web3-v1-rpc.ckbapp.dev -X POST -H "Content-Type: application/json" -d '{"jsonrpc": "2.0", "method":"gw_get_block_by_number", "params": ["0xcb"], "id": 1}'
{"jsonrpc":"2.0","id":1,"error":{"code":-32603,"message":"Internal error"}}
curl https://godwoken-testnet-web3-v1-rpc.ckbapp.dev -X POST -H "Content-Type: application/json" -d '{"jsonrpc": "2.0", "method":"gw_get_tip_block_hash", "params": [], "id": 1}'
{"jsonrpc":"2.0","id":1,"error":{"code":-32603,"message":"Internal error"}}
env: https://github.com/RetricSu/godwoken-kicker.git
branch: compatibility-changes
commit: 76430974cc0b8f88e2bca659725cb8664d3b78d2
solodity code
pragma solidity ^0.6.10;
contract CrossCallBugTest{
CrossCall1 cc;
CrossCall1 cc1;
constructor () public {
cc = new CrossCall1();
cc1 = new CrossCall1();
cc.setOtherAddress(address(cc1));
cc1.setOtherAddress(address(cc));
}
function call_stack(uint stackSize) public returns(uint256){
return cc.call_stack(stackSize-1)+stackSize;
}
}
contract CrossCall1{
address otherAddress;
function setOtherAddress(address addr) public {
otherAddress = addr;
}
function call_stack(uint stackSize) public returns(uint256){
CrossCall1 cc = CrossCall1(otherAddress);
if(stackSize<=0){
return 1;
}
try cc.call_stack(stackSize-1) returns(uint256 num){
return num+stackSize;
}catch {
return cc.call_stack{gas:100000}(stackSize-1);
}
}
}
hardhat local net: https://github.com/gpBlockchain/gw-evm-opcode-test/runs/5733544282
gw net:https://github.com/gpBlockchain/gw-evm-opcode-test/runs/5733642755?check_suite_focus=true
env: ghcr.io/nervosnetwork/godwoken-web3-indexer-prebuilds:compatibility-breaking-changes-1a52afb
Use hardhat
to send contract transactions frequently, and the gw-web3-indexer
reports an error when synchronizing data, causing the process to exit abnormally
There are also some exception logs, I don't know if it is a problem
env:https://godwoken-testnet-web3-v1-rpc.ckbapp.dev/
let filterId = await ethers.provider.send("eth_newPendingTransactionFilter",[]);
await sendTxCount(ethers.provider,10)
let logs = await ethers.provider.send("eth_getFilterChanges", [filterId]);
console.log(logs);
send successful: 10
[]
send successful: 10
[
'0x1aac02dc1132dccfc3d685d34e202e3d2a28bb8b7f5234f7309570365d948e9a',
'0x3c0636d6123fdd93fe5a8ea69d957438daf23f7bed0d33896dead31b63d18523',
'0x13fa0ea1c7fa0e688c9108f52b31cbd2c172bcd16a07e79eb5aa2a5490529c9e',
'0xfb49e663281b73bd08a1c5b9ccc3bb2c3f6e330d529cb40cfcfa0fc0a38e995c',
'0x43a46279323e1ac835ab1f0f2f35cc6d10b195da1d8dac7f76ccdf27075add4f',
'0x82f25d175826c5306bc53cc2bf6cc2bd102d1e011862cff1a69f9c0ef5f0c5a6',
'0xc1cf5dbd1d6e5df6341cf0ff9ff54300de8eeb4d38d138e624c774711c795fdf',
'0xe1b1c580a618adf8a8150d704eebc3e9a6e3312200f244b55bf711ee2fde48b4',
'0x1dfea99dbdf040b0f182f856ca8f23b2df5a0aeb17139e8a113d14b7c869044f',
'0xeee0fa0653596bb24ddaa205e4d057418a8f0c99e719d1215adeab02edfb73b6'
]
解析608区块数据的时候有这么一种交易{"raw":{"from_id":"0x2","to_id":"0x4","nonce":"0x2","args":"0x03000000380000000c00000030000000010000006e45d598f56e7d81eaf1f918fe8178e18cfdf9fef0ef7cb75bfac5b5ea69c1b40000000000000000"}
之前处理v0 的时候没遇到过,请问这种是什么类型的交易?如何解析?
Originally posted by @zmcNotafraid in #184 (comment)
curl https://godwoken-testnet-web3-v1-rpc.ckbapp.dev -X POST -H "Content-Type: application/json" -d '{"jsonrpc": "2.0", "method":"gw_get_block_by_number", "params": ["0x41b"], "id": 1}'
{"jsonrpc":"2.0","id":1,"error":{"code":-32603,"message":"Internal error"}}
env: https://godwoken-testnet-web3-v1-rpc.ckbapp.dev/
One thread keeps sending transactions
, and one thread keeps sending getTransactionCount
,getTransactionCount
occasionally returns the wrong number of transactions
async function getTxCount(provider,address){
while (true) {
let count = provider.getTransactionCount(address,"pending")
let blkNum = provider.getBlockNumber();
console.log("address:",address,"nonce:",await count,",blockNum:",await blkNum)
}
}
address: Promise { '0x0C1EfCCa2Bcb65A532274f3eF24c044EF4ab6D73' } nonce: 2300 ,blockNum: 81114
address: Promise { '0x0C1EfCCa2Bcb65A532274f3eF24c044EF4ab6D73' } nonce: 2300 ,blockNum: 81114
address: Promise { '0x0C1EfCCa2Bcb65A532274f3eF24c044EF4ab6D73' } nonce: 2300 ,blockNum: 81114
address: Promise { '0x0C1EfCCa2Bcb65A532274f3eF24c044EF4ab6D73' } nonce: 2301 ,blockNum: 81114
address: Promise { '0x0C1EfCCa2Bcb65A532274f3eF24c044EF4ab6D73' } nonce: 2301 ,blockNum: 81114
address: Promise { '0x0C1EfCCa2Bcb65A532274f3eF24c044EF4ab6D73' } nonce: 2301 ,blockNum: 81114
address: Promise { '0x0C1EfCCa2Bcb65A532274f3eF24c044EF4ab6D73' } nonce: 2301 ,blockNum: 81114
address: Promise { '0x0C1EfCCa2Bcb65A532274f3eF24c044EF4ab6D73' } nonce: 2302 ,blockNum: 81114
address: Promise { '0x0C1EfCCa2Bcb65A532274f3eF24c044EF4ab6D73' } nonce: 2302 ,blockNum: 81114
address: Promise { '0x0C1EfCCa2Bcb65A532274f3eF24c044EF4ab6D73' } nonce: 2302 ,blockNum: 81114
address: Promise { '0x0C1EfCCa2Bcb65A532274f3eF24c044EF4ab6D73' } nonce: 2302 ,blockNum: 81114
address: Promise { '0x0C1EfCCa2Bcb65A532274f3eF24c044EF4ab6D73' } nonce: 2303 ,blockNum: 81114
address: Promise { '0x0C1EfCCa2Bcb65A532274f3eF24c044EF4ab6D73' } nonce: 2303 ,blockNum: 81114
address: Promise { '0x0C1EfCCa2Bcb65A532274f3eF24c044EF4ab6D73' } nonce: 2303 ,blockNum: 81114
address: Promise { '0x0C1EfCCa2Bcb65A532274f3eF24c044EF4ab6D73' } nonce: 2303 ,blockNum: 81114
address: Promise { '0x0C1EfCCa2Bcb65A532274f3eF24c044EF4ab6D73' } nonce: 2303 ,blockNum: 81115
address: Promise { '0x0C1EfCCa2Bcb65A532274f3eF24c044EF4ab6D73' } nonce: 2303 ,blockNum: 81115
address: Promise { '0x0C1EfCCa2Bcb65A532274f3eF24c044EF4ab6D73' } nonce: 2303 ,blockNum: 81115
address: Promise { '0x0C1EfCCa2Bcb65A532274f3eF24c044EF4ab6D73' } nonce: 2303 ,blockNum: 81115
address: Promise { '0x0C1EfCCa2Bcb65A532274f3eF24c044EF4ab6D73' } nonce: 2286 ,blockNum: 81115
address: Promise { '0x0C1EfCCa2Bcb65A532274f3eF24c044EF4ab6D73' } nonce: 2286 ,blockNum: 81115
address: Promise { '0x0C1EfCCa2Bcb65A532274f3eF24c044EF4ab6D73' } nonce: 2286 ,blockNum: 81115
address: Promise { '0x0C1EfCCa2Bcb65A532274f3eF24c044EF4ab6D73' } nonce: 2286 ,blockNum: 81115
address: Promise { '0x0C1EfCCa2Bcb65A532274f3eF24c044EF4ab6D73' } nonce: 2286 ,blockNum: 81115
address: Promise { '0x0C1EfCCa2Bcb65A532274f3eF24c044EF4ab6D73' } nonce: 2286 ,blockNum: 81115
address: Promise { '0x0C1EfCCa2Bcb65A532274f3eF24c044EF4ab6D73' } nonce: 2299 ,blockNum: 81115
address: Promise { '0x0C1EfCCa2Bcb65A532274f3eF24c044EF4ab6D73' } nonce: 2304 ,blockNum: 81115
address: Promise { '0x0C1EfCCa2Bcb65A532274f3eF24c044EF4ab6D73' } nonce: 2304 ,blockNum: 81115
address: Promise { '0x0C1EfCCa2Bcb65A532274f3eF24c044EF4ab6D73' } nonce: 2304 ,blockNum: 81115
send Send non-illegal transactions,getTransactionCount only increase not decrease
Found strange behaviour during call of transaction with my deployed erc20 contract.
curl -X POST http://localhost:8024 -H "Content-Type: application/json" --data '{"id":"test","jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0xead2460ef616968a9c1f6d1c044f6853a688dab303b5e78af4e46109829071ce"]}' | json_pp
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2324 100 2178 100 146 708k 48666 --:--:-- --:--:-- --:--:-- 756k
{
"id" : "test",
"jsonrpc" : "2.0",
"result" : {
"blockHash" : "0x66d4b69be1e3bcd83f73bd1248a42a9027e5897be7fa36cd72b39662fd55ade9",
"blockNumber" : "0x3c",
"contractAddress" : "0xc4f4892f743e935c8bb7ce5d639f3d44d2297837",
"cumulativeGasUsed" : "0x26060",
"from" : "0x6daf63d8411d6e23552658e3cfb48416a6a2ca78",
"gasUsed" : "0x1bad1",
"logs" : [
{
"address" : "0xc4f4892f743e935c8bb7ce5d639f3d44d2297837",
"blockHash" : "0x66d4b69be1e3bcd83f73bd1248a42a9027e5897be7fa36cd72b39662fd55ade9",
"blockNumber" : "0x3c",
"data" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"logIndex" : "0x0",
"removed" : false,
"topics" : [
"0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0",
"0x0000000000000000000000000000000000000000000000000000000000000000",
"0x0000000000000000000000006daf63d8411d6e23552658e3cfb48416a6a2ca78"
],
"transactionHash" : "0xead2460ef616968a9c1f6d1c044f6853a688dab303b5e78af4e46109829071ce",
"transactionIndex" : "0x2"
},
{
"address" : "0xc4f4892f743e935c8bb7ce5d639f3d44d2297837",
"blockHash" : "0x66d4b69be1e3bcd83f73bd1248a42a9027e5897be7fa36cd72b39662fd55ade9",
"blockNumber" : "0x3c",
"data" : "0x00000000000000000000000000000000000000000000d3c21bcecceda1000000",
"logIndex" : "0x1",
"removed" : false,
"topics" : [
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
"0x0000000000000000000000000000000000000000000000000000000000000000",
"0x0000000000000000000000006daf63d8411d6e23552658e3cfb48416a6a2ca78"
],
"transactionHash" : "0xead2460ef616968a9c1f6d1c044f6853a688dab303b5e78af4e46109829071ce",
"transactionIndex" : "0x2"
}
],
"logsBloom" : "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"status" : "0x1",
"to" : null,
"transactionHash" : "0x7ee60cc2918eb544d73f2b0c0777b787ad9984f0eb9ae50a5c0224f9069a76c3",
"transactionIndex" : "0x2"
}
}
As u could see, the block hash is 0x66d4b69be1e3bcd83f73bd1248a42a9027e5897be7fa36cd72b39662fd55ade9
. When I trying to get info about transactions:
curl -X POST http://localhost:8024 -H "Content-Type: application/json" --data '{"id":"test","jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0x66d4b69be1e3bcd83f73bd1248a42a9027e5897be7fa36cd72b39662fd55ade9", false]}' | json_pp
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1786 100 1640 100 146 533k 48666 --:--:-- --:--:-- --:--:-- 581k
{
"id" : "test",
"jsonrpc" : "2.0",
"result" : {
"difficulty" : "0x8e1bc9bf04000",
"extraData" : "0x",
"gasLimit" : "0x2f877",
"gasUsed" : "0x26060",
"hash" : "0x66d4b69be1e3bcd83f73bd1248a42a9027e5897be7fa36cd72b39662fd55ade9",
"logsBloom" : "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"miner" : "0xd2c9a40cb17acfeb23baba8de2766e4b90b1e875",
"mixHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"nonce" : "0x0000000000000000",
"number" : "0x3c",
"parentHash" : "0xdf63c6d7edd8fc64d1815721aaf0df9eb1bf2545cd4c676c002f6f8846d8a047",
"receiptsRoot" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"sha3Uncles" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"size" : "0x194",
"stateRoot" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x6225f4d9",
"totalDifficulty" : "0x8e1bc9bf04000",
"transactions" : [
"0x03679e972faa0c17a52ed57bd8d2016b14606e0e4fd6f9acca00eaa572c4a193",
"0xed073329c52def93bd77491a6cefac15665813c5201c1719ae8de486da9c5172",
"0x7ee60cc2918eb544d73f2b0c0777b787ad9984f0eb9ae50a5c0224f9069a76c3"
],
"transactionsRoot" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"uncles" : []
}
}
I am not see my tx with hash - 0xead2460ef616968a9c1f6d1c044f6853a688dab303b5e78af4e46109829071ce
. Also weird why tx has another hash in response and I do not see the logsBloom (while I have a two events).
Update: After some minutes 10-15, all my transaction dissapeared:
curl -X POST http://localhost:8024 -H "Content-Type: application/json" --data '{"id":"test","jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0xead2460ef616968a9c1f6d1c044f6853a688dab303b5e78af4e46109829071ce"]}' | json_pp
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 189 100 43 100 146 21500 73000 --:--:-- --:--:-- --:--:-- 94500
{
"id" : "test",
"jsonrpc" : "2.0",
"result" : null
}
SOme logs from truffle:
1_initial_migration.js
======================
Deploying 'Migrations'
----------------------
> transaction hash: 0x7d5daead202b72a7d4af2cc91d40c6d3e1b26f280b177c70f9f34b9775934234
> Blocks: 0 Seconds: 0
> contract address: 0x72C5A334E94DdCE3C71548A93512Ada93FBCe667
> block number: 58
> block timestamp: 1646654616
> account: 0x6DaF63D8411D6E23552658E3cFb48416A6A2CA78
> balance: 0.000000039999978926
> gas used: 21074 (0x5252)
> gas price: 0.000000001 gwei
> value sent: 0 ETH
> total cost: 0.000000000000021074 ETH
> Saving migration to chain.
> Saving artifacts
-------------------------------------
> Total cost: 0.000000000000021074 ETH
2_deploy_ico.js
===============
Deploying 'SigmaToken'
----------------------
> transaction hash: 0xead2460ef616968a9c1f6d1c044f6853a688dab303b5e78af4e46109829071ce
> Blocks: 0 Seconds: 0
> contract address: 0xC4f4892f743e935C8bb7Ce5d639F3d44D2297837
> block number: 59
> block timestamp: 1646654648
> account: 0x6DaF63D8411D6E23552658E3cFb48416A6A2CA78
> balance: 0.000000039999844256
> gas used: 113361 (0x1bad1)
> gas price: 0.000000001 gwei
> value sent: 0 ETH
> total cost: 0.000000000000113361 ETH
> Saving migration to chain.
> Saving artifacts
-------------------------------------
> Total cost: 0.000000000000113361 ETH
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.