Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

msg.sender throws exception in my constellation of Geth, Solidity, and Web3 #21685

Closed
datafatmunger opened this issue Oct 11, 2020 · 30 comments
Closed

Comments

@datafatmunger
Copy link

System information

Geth version: 1.9.22-stable-c71a7e26
OS & Version: Linux f6f221184e1a 5.8.13-arch1-1 #1 SMP PREEMPT Thu, 01 Oct 2020 20:40:35 +0000 x86_64 x86_64 x86_64 GNU/Linux
Commit hash : ...
Solidity: 0.7.3+commit.9bfce1f6.Linux.g++
Web3: 1.3.0

Expected behaviour

msg.sender is the from field/address coming in from the HTTP provider in the case of non-constant contract functions.

Actual behaviour

Exception is thrown.

Steps to reproduce the behaviour

Simple contract:

  address lastAddr;

  function addPost(string memory title, string memory description) public {
    //lastAddr = address(0x79D9A20F9A24f4F52da3930F9B3E84144A209E35); // Works
    lastAddr = msg.sender; // Throws exception
  }

  function getAddr() public view returns (address) {
    return lastAddr; // This always returns 0x0000000000000000000000000000000000000000, but likely because it throws before it's set in the last function
  }

Backtrace

Error: Transaction has been reverted by the EVM:
{
  "blockHash": "0x51510a4d384b6544638bacdcc2abc03eaccc3e03e5db9fb3f0c54e9134d6d642",
  "blockNumber": 1805,
  "contractAddress": null,
  "cumulativeGasUsed": 214505,
  "from": "0x79d9a20f9a24f4f52da3930f9b3e84144a209e35",
  "gasUsed": 214505,
  "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  "status": false,
  "to": "0x514cfe6379dd47447ddc855510338751a6f27e13",
  "transactionHash": "0xcf7016b3a265275698962e9e0c4bad0cd96c2b1f176d3805b9a196e250b527b1",
  "transactionIndex": 0,
  "events": {}
}
    at Object.TransactionError (/root/peerpolls/node_modules/web3-core-helpers/lib/errors.js:87:21)
    at Object.TransactionRevertedWithoutReasonError (/root/peerpolls/node_modules/web3-core-helpers/lib/errors.js:98:21)
    at /root/peerpolls/node_modules/web3-core-method/lib/index.js:397:57
    at processTicksAndRejections (internal/process/task_queues.js:93:5) {
  receipt: {
    blockHash: '0x51510a4d384b6544638bacdcc2abc03eaccc3e03e5db9fb3f0c54e9134d6d642',
    blockNumber: 1805,
    contractAddress: null,
    cumulativeGasUsed: 214505,
    from: '0x79d9a20f9a24f4f52da3930f9b3e84144a209e35',
    gasUsed: 214505,
    logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
    status: false,
    to: '0x514cfe6379dd47447ddc855510338751a6f27e13',
    transactionHash: '0xcf7016b3a265275698962e9e0c4bad0cd96c2b1f176d3805b9a196e250b527b1',
    transactionIndex: 0,
    events: {}
  }
}

Additional information ...

What web3 is sending ...

{
  jsonrpc: '2.0',
  id: 6,
  method: 'eth_sendTransaction',
  params: [
    {
      from: '0x79d9a20f9a24f4f52da3930f9b3e84144a209e35',
      gas: '0x345e9',
      data: '0xb02c6516000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000031546865204e65746865726c616e647320676f7665726e6d656e7420646f6573206e6f7420726570726573656e74206d652e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000056456c6563746564206f6666696369616c732072657175697265206c6172676520646f6e6f727320616e642072617468657220666f6c6c6f772074686f736520696e746572657374732c206f766572206d79206f776e2e00000000000000000000',
      gasPrice: '0x3b9aca00',
      to: '0x514cfe6379dd47447ddc855510338751a6f27e13'
    }
  ]
}

... I feel pretty confident the from/sender address is there until it hits geth. 🤷‍♀️ The contract address is also correct here.

@beyonderyue
Copy link

Is there any log?

@datafatmunger
Copy link
Author

@beyonderyue thank you for the reply ... the log below ... some interesting stuff there for a private blockchain.

DEBUG[10-13|10:13:51.548] Executing EVM call finished              runtime="90.381µs"
DEBUG[10-13|10:13:51.548] Served eth_estimateGas                   conn=127.0.0.1:59034 reqid=4 t=2.658636ms
DEBUG[10-13|10:13:51.553] Served eth_gasPrice                      conn=127.0.0.1:59034 reqid=5 t=1.075551ms
INFO [10-13|10:13:51.555] Setting new local account                address=0x79D9A20F9A24f4F52da3930F9B3E84144A209E35
TRACE[10-13|10:13:51.555] Pooled new future transaction            hash="5d0983…35f34b" from=0x79D9A20F9A24f4F52da3930F9B3E84144A209E35 to=0x514CFE6379dd47447DDc855510338751a6F27e13
TRACE[10-13|10:13:51.555] Removed old queued transactions          count=0
TRACE[10-13|10:13:51.555] Removed unpayable queued transactions    count=0
TRACE[10-13|10:13:51.555] Promoted queued transactions             count=1
INFO [10-13|10:13:51.555] Submitted transaction                    fullhash=0x5d0983d6250f869e226a66a9dc3d8ac0ddd21714f63ca2caf01b0c5bf435f34b recipient=0x514CFE6379dd47447DDc855510338751a6F27e13
TRACE[10-13|10:13:51.555] Broadcast transaction                    hash="5d0983…35f34b" recipients=0
DEBUG[10-13|10:13:51.555] Served eth_sendTransaction               conn=127.0.0.1:59036 reqid=6 t="465.964µs"
DEBUG[10-13|10:13:51.557] Served eth_getTransactionReceipt         conn=127.0.0.1:59034 reqid=7 t="95.846µs"
TRACE[10-13|10:13:51.627] >> FINDNODE/v4                           id=267f3a11dba8dc22 addr=206.189.23.182:30303  err=nil
TRACE[10-13|10:13:51.699] FINDNODE failed                          id=2678244933e07b88 failcount=1  dropped=false err="RPC timeout"
TRACE[10-13|10:13:51.700] >> PING/v4                               id=2661c0557f32d473 addr=5.101.0.242:30339     err=nil
TRACE[10-13|10:13:52.002] Decrease miner recommit interval         from=3s to=3s
INFO [10-13|10:13:52.002] Commit new mining work                   number=2861 sealhash="383266…6fd193" uncles=0 txs=1 gas=214505 fees=0.000214505 elapsed=1.022ms
TRACE[10-13|10:13:52.002] Waiting for slot to sign and propagate   delay=11.997s
DEBUG[10-13|10:13:52.084] Transaction pool status report           executable=1 queued=0 stales=0
TRACE[10-13|10:13:52.127] FINDNODE failed                          id=267f3a11dba8dc22 failcount=1  dropped=false err="RPC timeout"
TRACE[10-13|10:13:52.127] >> PING/v4                               id=2667815e88781024 addr=94.79.55.28:30000     err=nil
TRACE[10-13|10:13:52.538] >> FINDNODE/v4                           id=267ca0d34aa42fdb addr=188.166.238.73:30303  err=nil
DEBUG[10-13|10:13:52.563] Served eth_getTransactionReceipt         conn=127.0.0.1:59036 reqid=8 t="213.424µs"
TRACE[10-13|10:13:52.701] >> FINDNODE/v4                           id=2661c0557f32d473 addr=5.101.0.242:30339     err=nil
TRACE[10-13|10:13:53.038] FINDNODE failed                          id=267ca0d34aa42fdb failcount=1  dropped=false err="RPC timeout"
TRACE[10-13|10:13:53.039] >> PING/v4                               id=2669fd575d5829ef addr=18.234.248.151:30303  err=nil
TRACE[10-13|10:13:53.119] Updating DNS discovery root              tree=all.mainnet.ethdisco.net err="lookup all.mainnet.ethdisco.net on 192.168.43.24:53: dial udp 192.168.43.24:53: i/o timeout"
DEBUG[10-13|10:13:53.119] Error in DNS random node sync            tree=all.mainnet.ethdisco.net err="lookup all.mainnet.ethdisco.net on 192.168.43.24:53: dial udp 192.168.43.24:53: i/o timeout"
TRACE[10-13|10:13:53.126] Starting p2p dial                        id=102a7626b2bc98cc ip=35.172.218.28   flag=dyndial
TRACE[10-13|10:13:53.126] Starting p2p dial                        id=14391d2224a6c0b1 ip=159.65.253.205  flag=dyndial
TRACE[10-13|10:13:53.128] >> FINDNODE/v4                           id=2667815e88781024 addr=94.79.55.28:30000     err=nil
TRACE[10-13|10:13:53.201] FINDNODE failed                          id=2661c0557f32d473 failcount=1  dropped=false err="RPC timeout"
TRACE[10-13|10:13:53.359] Failed p2p handshake                     id=102a7626b2bc98cc addr=35.172.218.28:30303   conn=dyndial         err="too many peers"
TRACE[10-13|10:13:53.361] Failed p2p handshake                     id=14391d2224a6c0b1 addr=159.65.253.205:30303  conn=dyndial         err="too many peers"
DEBUG[10-13|10:13:53.563] Served eth_getTransactionReceipt         conn=127.0.0.1:59034 reqid=9 t="226.649µs"
TRACE[10-13|10:13:53.628] FINDNODE failed                          id=2667815e88781024 failcount=1  dropped=false err="RPC timeout"
TRACE[10-13|10:13:53.707] >> PING/v4                               id=872752ec8ba84d51 addr=5.226.70.12:25267     err=nil
TRACE[10-13|10:13:54.040] >> FINDNODE/v4                           id=2669fd575d5829ef addr=18.234.248.151:30303  err=nil
DEBUG[10-13|10:13:54.208] Removed dead node                        b=6  id=872752ec8ba84d51 ip=5.226.70.12     checks=0
TRACE[10-13|10:13:54.540] FINDNODE failed                          id=2669fd575d5829ef failcount=1  dropped=false err="RPC timeout"
TRACE[10-13|10:13:54.541] >> FINDNODE/v4                           id=b6c5a383c111cfbd addr=88.198.159.97:30303   err=nil
TRACE[10-13|10:13:54.541] >> FINDNODE/v4                           id=b5526c38f296479b addr=34.85.64.38:30303     err=nil
TRACE[10-13|10:13:54.541] >> FINDNODE/v4                           id=b3557276c487f8db addr=54.68.121.166:20202   err=nil
DEBUG[10-13|10:13:54.564] Served eth_getTransactionReceipt         conn=127.0.0.1:59036 reqid=10 t="410.231µs"
TRACE[10-13|10:13:54.578] << PING/v4                               id=b6c5a383c111cfbd addr=88.198.159.97:30303   err=nil
TRACE[10-13|10:13:54.578] >> PONG/v4                               id=b6c5a383c111cfbd addr=88.198.159.97:30303   err=nil
TRACE[10-13|10:13:54.605] Invalid neighbor node received           ip=114.67.103.191  addr=88.198.159.97:30303   err="low port"
TRACE[10-13|10:13:54.607] << NEIGHBORS/v4                          id=b6c5a383c111cfbd addr=88.198.159.97:30303   err=nil
TRACE[10-13|10:13:54.608] << NEIGHBORS/v4                          id=b6c5a383c111cfbd addr=88.198.159.97:30303   err=nil
TRACE[10-13|10:13:54.609] >> PING/v4                               id=b42a8f1679e93cfa addr=34.91.245.22:44000    err=nil
TRACE[10-13|10:13:54.804] << NEIGHBORS/v4                          id=b5526c38f296479b addr=34.85.64.38:30303     err=nil
TRACE[10-13|10:13:54.805] << NEIGHBORS/v4                          id=b5526c38f296479b addr=34.85.64.38:30303     err=nil
TRACE[10-13|10:13:54.806] >> PING/v4                               id=b42cc970bb3c59a9 addr=165.227.42.105:30303  err=nil
TRACE[10-13|10:13:55.041] FINDNODE failed                          id=b3557276c487f8db failcount=1  dropped=false err="RPC timeout"
TRACE[10-13|10:13:55.042] >> PING/v4                               id=b42ee9d40fe70086 addr=35.243.131.80:30303   err=nil
TRACE[10-13|10:13:55.162] << PONG/v4                               id=b42ee9d40fe70086 addr=35.243.131.80:30303   err=nil
TRACE[10-13|10:13:55.163] << PING/v4                               id=b42ee9d40fe70086 addr=35.243.131.80:30303   err=nil
TRACE[10-13|10:13:55.164] >> PONG/v4                               id=b42ee9d40fe70086 addr=35.243.131.80:30303   err=nil
DEBUG[10-13|10:13:55.563] Served eth_getTransactionReceipt         conn=127.0.0.1:59034 reqid=11 t="232.52µs"
TRACE[10-13|10:13:55.610] >> FINDNODE/v4                           id=b42a8f1679e93cfa addr=34.91.245.22:44000    err=nil
TRACE[10-13|10:13:55.663] >> FINDNODE/v4                           id=b42ee9d40fe70086 addr=35.243.131.80:30303   err=nil
TRACE[10-13|10:13:55.783] << NEIGHBORS/v4                          id=b42ee9d40fe70086 addr=35.243.131.80:30303   err=nil
TRACE[10-13|10:13:55.784] << NEIGHBORS/v4                          id=b42ee9d40fe70086 addr=35.243.131.80:30303   err=nil
TRACE[10-13|10:13:55.785] >> PING/v4                               id=b4206f1c949f557a addr=78.47.197.99:23000    err=nil
TRACE[10-13|10:13:55.806] >> FINDNODE/v4                           id=b42cc970bb3c59a9 addr=165.227.42.105:30303  err=nil
TRACE[10-13|10:13:55.815] << PONG/v4                               id=b4206f1c949f557a addr=78.47.197.99:23000    err=nil
TRACE[10-13|10:13:55.815] << PING/v4                               id=b4206f1c949f557a addr=78.47.197.99:23000    err=nil
TRACE[10-13|10:13:55.816] >> PONG/v4                               id=b4206f1c949f557a addr=78.47.197.99:23000    err=nil
TRACE[10-13|10:13:56.110] FINDNODE failed                          id=b42a8f1679e93cfa failcount=1  dropped=false err="RPC timeout"
TRACE[10-13|10:13:56.110] >> PING/v4                               id=b422c184bca59da4 addr=139.196.120.23:30303  err=nil
TRACE[10-13|10:13:56.306] FINDNODE failed                          id=b42cc970bb3c59a9 failcount=1  dropped=false err="RPC timeout"
TRACE[10-13|10:13:56.307] >> PING/v4                               id=b424d5423e982c5b addr=136.25.136.43:1025    err=nil
TRACE[10-13|10:13:56.316] >> FINDNODE/v4                           id=b4206f1c949f557a addr=78.47.197.99:23000    err=nil
TRACE[10-13|10:13:56.344] Invalid neighbor node received           ip=165.22.115.92   addr=78.47.197.99:23000    err="low port"
TRACE[10-13|10:13:56.346] << NEIGHBORS/v4                          id=b4206f1c949f557a addr=78.47.197.99:23000    err=nil
TRACE[10-13|10:13:56.347] << NEIGHBORS/v4                          id=b4206f1c949f557a addr=78.47.197.99:23000    err=nil
TRACE[10-13|10:13:56.348] >> PING/v4                               id=b426d56f20a7432a addr=18.130.200.224:33497  err=nil
DEBUG[10-13|10:13:56.564] Served eth_getTransactionReceipt         conn=127.0.0.1:59036 reqid=12 t="196.147µs"
TRACE[10-13|10:13:57.111] >> FINDNODE/v4                           id=b422c184bca59da4 addr=139.196.120.23:30303  err=nil
TRACE[10-13|10:13:57.308] >> FINDNODE/v4                           id=b424d5423e982c5b addr=136.25.136.43:1025    err=nil
TRACE[10-13|10:13:57.349] >> FINDNODE/v4                           id=b426d56f20a7432a addr=18.130.200.224:33497  err=nil
DEBUG[10-13|10:13:57.565] Served eth_getTransactionReceipt         conn=127.0.0.1:59034 reqid=13 t="237.672µs"
TRACE[10-13|10:13:57.611] FINDNODE failed                          id=b422c184bca59da4 failcount=2  dropped=false err="RPC timeout"
TRACE[10-13|10:13:57.612] >> PING/v4                               id=b4393da6a027aefb addr=124.156.147.4:8888    err=nil
TRACE[10-13|10:13:57.808] FINDNODE failed                          id=b424d5423e982c5b failcount=2  dropped=false err="RPC timeout"
TRACE[10-13|10:13:58.125] Updating DNS discovery root              tree=all.mainnet.ethdisco.net err="lookup all.mainnet.ethdisco.net on 192.168.43.24:53: dial udp 192.168.43.24:53: i/o timeout"
DEBUG[10-13|10:13:58.125] Error in DNS random node sync            tree=all.mainnet.ethdisco.net err="lookup all.mainnet.ethdisco.net on 192.168.43.24:53: dial udp 192.168.43.24:53: i/o timeout"
TRACE[10-13|10:13:58.127] Starting p2p dial                        id=e858a92b6bde1828 ip=78.47.3.143     flag=dyndial
INFO [10-13|10:13:58.127] Looking for peers                        peercount=0 tried=4 static=0
TRACE[10-13|10:13:58.127] Starting p2p dial                        id=e989c6447678be64 ip=13.53.186.70    flag=dyndial
TRACE[10-13|10:13:58.194] Failed p2p handshake                     id=e858a92b6bde1828 addr=78.47.3.143:30303     conn=dyndial         err="too many peers"
TRACE[10-13|10:13:58.215] Rejected peer                            id=e989c6447678be64 addr=13.53.186.70:30308    conn=dyndial         err="useless peer"
DEBUG[10-13|10:13:58.569] Served eth_getTransactionReceipt         conn=127.0.0.1:59036 reqid=14 t="246.844µs"
TRACE[10-13|10:13:58.613] >> FINDNODE/v4                           id=b4393da6a027aefb addr=124.156.147.4:8888    err=nil
TRACE[10-13|10:13:58.809] >> FINDNODE/v4                           id=b43e012ca5b877ac addr=35.159.1.5:5863       err=nil
TRACE[10-13|10:13:58.850] >> FINDNODE/v4                           id=b433cc026f5f164e addr=140.255.112.169:16964 err=nil
TRACE[10-13|10:13:59.113] FINDNODE failed                          id=b4393da6a027aefb failcount=2  dropped=false err="RPC timeout"
TRACE[10-13|10:13:59.114] >> PING/v4                               id=b434ab5c45076973 addr=47.105.154.161:20182  err=nil
TRACE[10-13|10:13:59.309] FINDNODE failed                          id=b43e012ca5b877ac failcount=1  dropped=false err="RPC timeout"
TRACE[10-13|10:13:59.310] >> PING/v4                               id=b40ad4a756e26895 addr=47.88.30.214:30303    err=nil
TRACE[10-13|10:13:59.350] FINDNODE failed                          id=b433cc026f5f164e failcount=1  dropped=false err="RPC timeout"
TRACE[10-13|10:13:59.351] >> PING/v4                               id=b40eb7b6e3b2b62a addr=120.79.88.66:30303    err=nil
TRACE[10-13|10:13:59.475] << PONG/v4                               id=b40ad4a756e26895 addr=47.88.30.214:30303    err=nil
TRACE[10-13|10:13:59.475] << PING/v4                               id=b40ad4a756e26895 addr=47.88.30.214:30303    err=nil
TRACE[10-13|10:13:59.476] >> PONG/v4                               id=b40ad4a756e26895 addr=47.88.30.214:30303    err=nil
DEBUG[10-13|10:13:59.568] Served eth_getTransactionReceipt         conn=127.0.0.1:59034 reqid=15 t="203.235µs"
TRACE[10-13|10:13:59.975] >> FINDNODE/v4                           id=b40ad4a756e26895 addr=47.88.30.214:30303    err=nil
TRACE[10-13|10:14:00.115] >> FINDNODE/v4                           id=b434ab5c45076973 addr=47.105.154.161:20182  err=nil
TRACE[10-13|10:14:00.141] Invalid neighbor node received           ip=114.67.103.191  addr=47.88.30.214:30303    err="low port"
TRACE[10-13|10:14:00.141] << NEIGHBORS/v4                          id=b40ad4a756e26895 addr=47.88.30.214:30303    err=nil
TRACE[10-13|10:14:00.142] << NEIGHBORS/v4                          id=b40ad4a756e26895 addr=47.88.30.214:30303    err=nil
TRACE[10-13|10:14:00.142] >> PING/v4                               id=b42c8c4e61300105 addr=128.199.170.48:30303  err=nil
TRACE[10-13|10:14:00.352] >> FINDNODE/v4                           id=b40eb7b6e3b2b62a addr=120.79.88.66:30303    err=nil
DEBUG[10-13|10:14:00.567] Served eth_getTransactionReceipt         conn=127.0.0.1:59036 reqid=16 t="253.074µs"
TRACE[10-13|10:14:00.615] FINDNODE failed                          id=b434ab5c45076973 failcount=2  dropped=false err="RPC timeout"
TRACE[10-13|10:14:00.615] >> PING/v4                               id=b439df9edbc006ff addr=18.179.50.95:30303    err=nil
TRACE[10-13|10:14:00.852] FINDNODE failed                          id=b40eb7b6e3b2b62a failcount=1  dropped=false err="RPC timeout"
TRACE[10-13|10:14:00.852] >> PING/v4                               id=b4372af3a66ca47d addr=111.229.162.136:20182 err=nil
TRACE[10-13|10:14:01.143] >> FINDNODE/v4                           id=b42c8c4e61300105 addr=128.199.170.48:30303  err=nil
DEBUG[10-13|10:14:01.569] Served eth_getTransactionReceipt         conn=127.0.0.1:59034 reqid=17 t="203.733µs"
TRACE[10-13|10:14:01.616] >> FINDNODE/v4                           id=b439df9edbc006ff addr=18.179.50.95:30303    err=nil
TRACE[10-13|10:14:01.643] FINDNODE failed                          id=b42c8c4e61300105 failcount=1  dropped=false err="RPC timeout"
TRACE[10-13|10:14:01.853] >> FINDNODE/v4                           id=b4372af3a66ca47d addr=111.229.162.136:20182 err=nil
TRACE[10-13|10:14:02.116] FINDNODE failed                          id=b439df9edbc006ff failcount=2  dropped=false err="RPC timeout"
TRACE[10-13|10:14:02.353] FINDNODE failed                          id=b4372af3a66ca47d failcount=1  dropped=false err="RPC timeout"
DEBUG[10-13|10:14:02.572] Served eth_getTransactionReceipt         conn=127.0.0.1:59036 reqid=18 t="239.841µs"
TRACE[10-13|10:14:03.127] Starting p2p dial                        id=f8201f0a40f703c4 ip=185.219.135.49  flag=dyndial
TRACE[10-13|10:14:03.127] Starting p2p dial                        id=fabca485da890aa5 ip=13.250.18.55    flag=dyndial
DEBUG[10-13|10:14:03.324] Ethereum handshake failed                id=f8201f0a40f703c4 conn=dyndial         err=EOF
DEBUG[10-13|10:14:03.324] Removing p2p peer                        peercount=0 id=f8201f0a40f703c4 duration=61.486ms           req=true err="subprotocol error"
DEBUG[10-13|10:14:03.571] Served eth_getTransactionReceipt         conn=127.0.0.1:59034 reqid=19 t="245.689µs"
DEBUG[10-13|10:14:03.921] Adding p2p peer                          peercount=1 id=fabca485da890aa5 conn=dyndial         addr=13.250.18.55:30303    name=Parity-Ethereum/v2.5...
TRACE[10-13|10:14:03.921] Starting protocol eth/63                 id=fabca485da890aa5 conn=dyndial
DEBUG[10-13|10:14:03.921] Ethereum peer connected                  id=fabca485da890aa5 conn=dyndial         name=Parity-Ethereum/v2.5.13-stable-253ff3f-20191231/x86_64-linux-gnu/rustc1.40.0
DEBUG[10-13|10:14:03.922] Ethereum handshake failed                id=fabca485da890aa5 conn=dyndial         err=EOF
DEBUG[10-13|10:14:03.922] Removing p2p peer                        peercount=0 id=fabca485da890aa5 duration=1.051ms            req=true err="too many peers"
INFO [10-13|10:14:04.001] Successfully sealed new block            number=2861 sealhash="383266…6fd193" hash="79c109…91eaef" elapsed=11.998s
INFO [10-13|10:14:04.001] 🔨 mined potential block                  number=2861 hash="79c109…91eaef"
TRACE[10-13|10:14:04.001] Propagated block                         hash="79c109…91eaef" recipients=0 duration=2562047h47m16.854s
DEBUG[10-13|10:14:04.001] Reinjecting stale transactions           count=0
TRACE[10-13|10:14:04.001] Announced block                          hash="79c109…91eaef" recipients=0 duration=2562047h47m16.854s
TRACE[10-13|10:14:04.001] Removed old pending transaction          hash="5d0983…35f34b"
INFO [10-13|10:14:04.002] Commit new mining work                   number=2862 sealhash="56d419…8413fd" uncles=0 txs=0 gas=0      fees=0           elapsed="722.018µs"
TRACE[10-13|10:14:04.002] Waiting for slot to sign and propagate   delay=14.997s
TRACE[10-13|10:14:04.159] >> PING/v4                               id=83be7d18f50c2221 addr=185.22.235.97:2743    err=nil
TRACE[10-13|10:14:04.213] << PONG/v4                               id=83be7d18f50c2221 addr=185.22.235.97:2743    err=nil
TRACE[10-13|10:14:04.214] << PING/v4                               id=83be7d18f50c2221 addr=185.22.235.97:2743    err=nil
TRACE[10-13|10:14:04.214] >> PING/v4                               id=83be7d18f50c2221 addr=185.22.235.97:2743    err=nil
TRACE[10-13|10:14:04.215] >> PONG/v4                               id=83be7d18f50c2221 addr=185.22.235.97:2743    err=nil
TRACE[10-13|10:14:04.274] << PONG/v4                               id=83be7d18f50c2221 addr=185.22.235.97:2743    err=nil
TRACE[10-13|10:14:04.274] << PING/v4                               id=83be7d18f50c2221 addr=185.22.235.97:2743    err=nil
TRACE[10-13|10:14:04.275] >> PONG/v4                               id=83be7d18f50c2221 addr=185.22.235.97:2743    err=nil
DEBUG[10-13|10:14:04.574] Served eth_getTransactionReceipt         conn=127.0.0.1:59036 reqid=20 t="908.421µs"
DEBUG[10-13|10:14:04.589] Executing EVM call finished              runtime="459.066µs"
DEBUG[10-13|10:14:04.589] Served eth_call                          conn=127.0.0.1:59034 reqid=21 t="825.017µs"
TRACE[10-13|10:14:04.774] >> ENRREQUEST/v4                         id=83be7d18f50c2221 addr=185.22.235.97:2743    err=nil
TRACE[10-13|10:14:04.824] << ENRRESPONSE/v4                        id=83be7d18f50c2221 addr=185.22.235.97:2743    err=nil
DEBUG[10-13|10:14:04.825] Revalidated node                         b=11 id=83be7d18f50c2221 checks=1
TRACE[10-13|10:14:04.998] >> PING/v4                               id=99036d6dbe781208 addr=51.107.3.79:30303     err=nil
DEBUG[10-13|10:14:05.021] Revalidated node                         b=13 id=99036d6dbe781208 checks=1
TRACE[10-13|10:14:05.021] << PONG/v4                               id=99036d6dbe781208 addr=51.107.3.79:30303     err=nil
DEBUG[10-13|10:14:08.084] Transaction pool status report           executable=0 queued=0 stales=0
DEBUG[10-13|10:14:08.085] Recalculated downloader QoS values       rtt=20s confidence=1.000 ttl=1m0s
TRACE[10-13|10:14:08.126] Updating DNS discovery root              tree=all.mainnet.ethdisco.net err="lookup all.mainnet.ethdisco.net on 192.168.43.24:53: dial udp 192.168.43.24:53: i/o timeout"
DEBUG[10-13|10:14:08.126] Error in DNS random node sync            tree=all.mainnet.ethdisco.net err="lookup all.mainnet.ethdisco.net on 192.168.43.24:53: dial udp 192.168.43.24:53: i/o timeout"
TRACE[10-13|10:14:08.128] Starting p2p dial                        id=fe13a985cb0bc862 ip=51.15.122.155   flag=dyndial
INFO [10-13|10:14:08.128] Looking for peers                        peercount=0 tried=4 static=0
TRACE[10-13|10:14:08.128] >> FINDNODE/v4                           id=44a3425ec55fd957 addr=51.107.0.49:30303     err=nil
TRACE[10-13|10:14:08.128] >> FINDNODE/v4                           id=71563f2370599df6 addr=34.255.23.113:30303   err=nil
TRACE[10-13|10:14:08.129] >> FINDNODE/v4                           id=77390dbee2558aaf addr=5.9.16.119:30303      err=nil
TRACE[10-13|10:14:08.169] << NEIGHBORS/v4                          id=44a3425ec55fd957 addr=51.107.0.49:30303     err=nil
INFO [10-13|10:14:10.261] HTTP server stopped                      endpoint=[::]:8545
DEBUG[10-13|10:14:10.261] RPC server shutting down
INFO [10-13|10:14:10.261] IPC endpoint closed                      url=/root/.ethereum/geth.ipc
DEBUG[10-13|10:14:10.261] RPC server shutting down
DEBUG[10-13|10:14:10.262] RPC connection read error                err=EOF
DEBUG[10-13|10:14:10.262] Reset ancient limit to zero
INFO [10-13|10:14:10.262] Ethereum protocol stopped
INFO [10-13|10:14:10.262] Transaction pool stopped
INFO [10-13|10:14:10.262] Writing cached state to disk             block=2861 hash="79c109…91eaef" root="9f5d71…d7c1c8"
INFO [10-13|10:14:10.262] Persisted trie from memory database      nodes=3 size=1.17KiB time="326.363µs" gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [10-13|10:14:10.263] Writing cached state to disk             block=2860 hash="909d05…b35cd2" root="c61bfd…9786f4"
INFO [10-13|10:14:10.263] Persisted trie from memory database      nodes=0 size=0.00B   time="4.779µs"   gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [10-13|10:14:10.263] Writing cached state to disk             block=2734 hash="d09da8…5de6a2" root="a567e2…a883dd"
INFO [10-13|10:14:10.263] Persisted trie from memory database      nodes=0 size=0.00B   time="4.242µs"   gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
DEBUG[10-13|10:14:10.263] Dereferenced trie from memory database   nodes=0 size=0.00B   time="3.518µs"   gcnodes=0 gcsize=0.00B gctime="2.689µs" livenodes=1 livesize=0.00B
DEBUG[10-13|10:14:10.263] Dereferenced trie from memory database   nodes=0 size=0.00B   time="1.177µs"   gcnodes=0 gcsize=0.00B gctime="3.516µs" livenodes=1 livesize=0.00B
DEBUG[10-13|10:14:10.263] Dereferenced trie from memory database   nodes=0 size=0.00B   time="3.14µs"    gcnodes=0 gcsize=0.00B gctime="6.224µs" livenodes=1 livesize=0.00B
INFO [10-13|10:14:10.263] Writing clean trie cache to disk         path=/root/.ethereum/geth/triecache threads=4
INFO [10-13|10:14:10.274] Persisted the clean trie cache           path=/root/.ethereum/geth/triecache elapsed=10.401ms
INFO [10-13|10:14:10.274] Blockchain stopped
DEBUG[10-13|10:14:10.274] Read error                               err="accept tcp [::]:30303: use of closed network connection"
DEBUG[10-13|10:14:10.274] Deleting port mapping                    proto=tcp extport=30303 intport=30303 interface="UPnP or NAT-PMP"
DEBUG[10-13|10:14:10.274] Deleting port mapping                    proto=udp extport=30303 intport=30303 interface="UPnP or NAT-PMP"
TRACE[10-13|10:14:10.274] P2P networking is spinning down
DEBUG[10-13|10:14:10.275] UDP read error                           err="read udp [::]:30303: use of closed network connection"

@beyonderyue
Copy link

Can you show the log from the beginning?

@datafatmunger
Copy link
Author

@beyonderyue ... thanks again for the reply.

https://gist.github.com/datafatmunger/e1a7539fae85ce35ab79c78716a3f83b

Hum...this is not the idea.

INFO [10-13|10:13:27.941] Starting Geth on Ethereum mainnet...

@beyonderyue
Copy link

Found no exception in logs... And I test your contract with remix, it seems ok

@datafatmunger
Copy link
Author

@beyonderyue this is supposed to be a private blockchain ... I'm not sure why it says, starting on mainnet?

@beyonderyue
Copy link

You should set flag --networkid= 65090

@datafatmunger
Copy link
Author

datafatmunger commented Oct 14, 2020

Okay ... I'm still REALLY stuck here. I'm currently starting Geth as follows:

... even built my own Geth prep'ing to do some serious debugging ... is this correct?, what should networkid be, does it matter?

./build/bin/geth --unlock "0x01aaafd0762F7233399ded6C49b06bbCa8Fc4A0E" --password /root/gethpass --mine --http --http.api "eth,net,web3,admin,personal" --allow-insecure-unlock --nousb --verbosity 3 --debug --nodiscover --maxpeers 0 --networkid 1337 console

I've got the most simple contract I can to reproduce the issue:

// SPDX-License-Identifier: MIT
pragma solidity ^0.7.3;

contract Test {

  address lastAddr;

  function setAddr() public {
    //lastAddr = address(0x79D9A20F9A24f4F52da3930F9B3E84144A209E35);
    lastAddr = msg.sender;
  }

  function getAddr() public view returns (address) {
    return lastAddr;
  }

}

... compiles, and everything looks fine ...

I'm try to just run this thing from the Geth console ... I use this ....

var abi = [{"inputs":[],"name":"getAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"setAddr","outputs":[],"stateMutability":"nonpayable","type":"function"}]

var comp = "0x" + "608060405234801561001057600080fd5b50610112806100206000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80639b8be4ee146037578063a74c2bb614603f575b600080fd5b603d6071565b005b604560b3565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690509056fea2646970667358221220dd8e05c26ee3c98cffcfd2ea22ce1dc18e0e2dd4b59090f36c289e49800e786c64736f6c63430007030033" 

var gas = eth.estimateGas({from: eth.coinbase, data: comp})

var factory =  eth.contract(abi)

factory.new({ from: eth.coinbase, data: comp, gas: gas}, function(e, contract) {
    if(!e) {
      if(!contract.address) {
        console.log("Contract transaction send: TransactionHash: " + contract.transactionHash + " waiting to be mined...");

      } else {
        console.log("Contract mined! Address: " + contract.address);
        instance = web3.eth.contract(abi).at(contract.address)
        console.log("Current addr: " + instance.getAddr());
      }
    } else {
      console.log(e);
    }
});

Run with ...

geth attach --preload deploy.js

In this case I get ...

> instance.get()
Error: invalid address
	at web3.js:3930:11(47)
	at web3.js:3756:41(16)
	at web3.js:5025:37(8)
	at web3.js:5024:12(13)
	at web3.js:5050:34(20)
	at web3.js:5075:39(15)
	at web3.js:4137:41(57)
	at web3.js:4223:75(24)
	at <eval>:1:1(2)

Tried...

> web3.eth.defaultAddress = eth.coinbase

and ...

> eth.defaultAddress = eth.coinbase

Same result ... starts to feel like my wallets are just incorrect or something else is going on ... ?

Thanks! cc @beyonderyue

@beyonderyue
Copy link

NetworkId is a unique tag of your private chain, generally can be same as your chainId.
It seems strange... Can you share your genesis file and the script you start geth?

@beyonderyue
Copy link

beyonderyue commented Oct 14, 2020

Can you deploy the contract correctly? I am confused... Or you set the flag networkId, still can't call the contract rightly?

@datafatmunger
Copy link
Author

Contract deploys fine. I can call the contract ... also just fine. What is not working ... it seems is specifically {from: addr ... in the calling of a contract method. I would expect msg.sender to reflect this from value ... it does not.

@datafatmunger
Copy link
Author

It's a bit like my addresses coming from web3 -> Geth don't get translated, even in the console.

@beyonderyue
Copy link

Can you test with remix? Firstly, make sure your geth works correctly.
https://remix-project.org

@beyonderyue
Copy link

beyonderyue commented Oct 14, 2020

Try follows in your geth console

var testContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"getAddr","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"title","type":"string"},{"name":"description","type":"string"}],"name":"addPost","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]);
var test = testContract.new(
   {
     from: web3.eth.accounts[0], 
     data: '0x608060405234801561001057600080fd5b5061029a806100206000396000f3fe608060405260043610610046576000357c010000000000000000000000000000000000000000000000000000000090048063a74c2bb61461004b578063b02c6516146100a2575b600080fd5b34801561005757600080fd5b50610060610201565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156100ae57600080fd5b506101ff600480360360408110156100c557600080fd5b81019080803590602001906401000000008111156100e257600080fd5b8201836020820111156100f457600080fd5b8035906020019184600183028401116401000000008311171561011657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561017957600080fd5b82018360208201111561018b57600080fd5b803590602001918460018302840111640100000000831117156101ad57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061022a565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505056fea165627a7a723058208a5135b93cb5fd36691f0cd29eb958ac60e33ed30a2abd59a1595e39d3eefdae0029', 
     gas: '4700000'
   }, function (e, contract){
    console.log(e, contract);
    if (typeof contract.address !== 'undefined') {
         console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
    }
 })

After you see the log 'Contract mined! address:...

test.addPost("1", "2", {from: eth.accounts[0]})
test.getAddr()

@datafatmunger
Copy link
Author

datafatmunger commented Oct 14, 2020

Hum ... I don't know that IDE. 🙁 I'm almost 100% my Geth is working, and a simple contract, the get/set an uint totally works.

There is something about the storage of the address from msg.sender (Spoiler alert ... I'm gonna guess something is wrong with address payable and address ... but it's a working hypothesis.

This illustrates the bug very clearly ... I think.

// SPDX-License-Identifier: MIT
pragma solidity ^0.7.3;

contract Test {

  address lastAddr;

  function set() public returns (address) {
    lastAddr = msg.sender;
    return lastAddr;
  }

  function get() public view returns (address) {
    return lastAddr;
  }

}
var comp = "0x" + "608060405234801561001057600080fd5b5061016a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80636d4ce63c1461003b578063b8e010de1461006f575b600080fd5b6100436100a3565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100776100cc565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690509056fea2646970667358221220d041ef57f69b14815435ee700bbb94f88d418e31593309154f2af8f1fe39841a64736f6c63430007030033"


var abi = [{"inputs":[],"name":"get","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"set","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"}]

var gas = eth.estimateGas({from: eth.coinbase, data: comp})

var factory =  eth.contract(abi)

eth.defaultAccount = eth.coinbase

factory.new({data: comp, gas: gas}, function(e, contract) {
    if(!e) {
      if(!contract.address) {
        console.log("Contract transaction send: TransactionHash: " + contract.transactionHash + " waiting to be mined...");

      } else {
        console.log("Contract mined! Address: " + contract.address);
        instance = web3.eth.contract(abi).at(contract.address);
        console.log("Current val: " + instance.get.call());

        gas = instance.set.estimateGas()
        console.log("Gas: " + gas);
        instance.set.call({gas: gas}, function(error, result) {

          console.log("RESULT: " + result);
          console.log("ERROR: " + error);
          console.log("Current ---" + instance.get.call());

          if(!error) {
              console.log("RESULT ---" + result);
          } else {
              console.log("ERROR ----" + error);
          }
        });


      }
    } else {
      console.log(e);
    }
});
root@f6f221184e1a:~# geth attach --preload peerpolls/deploy.js 
Contract transaction send: TransactionHash: 0x03e143ad5fbfa34e3286f3d96363c9b19c03d57f7610802163352b6d5fc88c7d waiting to be mined...
Welcome to the Geth JavaScript console!

instance: Geth/v1.9.23-unstable-1fed2234-20201013/linux-amd64/go1.13.8
coinbase: 0x01aaafd0762f7233399ded6c49b06bbca8fc4a0e
at block: 1199 (Wed Oct 14 2020 15:30:31 GMT+0200 (CEST))
 datadir: /root/.ethereum
 modules: admin:1.0 clique:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

> Contract mined! Address: 0x695fd8f6ddb545ff0b8769ac9fa79904d12673b0
Current val: 0x0000000000000000000000000000000000000000
Gas: 42982
RESULT: 0x01aaafd0762f7233399ded6c49b06bbca8fc4a0e
ERROR: null
Current ---0x0000000000000000000000000000000000000000
RESULT ---0x01aaafd0762f7233399ded6c49b06bbca8fc4a0e

@datafatmunger
Copy link
Author

Result from your example:

Contract mined! address: 0x2770e1a5644a8b75a33a399f0bfbd21187a43d07 transactionHash: 0xa15504ca8369649f353c3b2807b2e90bcae0104f8194c43afc12e6622fc6e64d

> test.addPost("1", "2", {from: eth.accounts[0]})
"0x585e32c1e8d15eeac2eb749b893867948d748b86e73969613fbc5579ef493ca6"
> test.getAddr()
"0x0000000000000000000000000000000000000000"
> 

@beyonderyue
Copy link

My result:

> test.addPost("1", "2", {from: eth.accounts[0]})
"0xcc6dec69d9e3f0c738ecffa3418acf55f323fbbf95b409791bc7121b57d048da"
> test.getAddr()
"0x40a34274fb811cfa0de2c994c9b4282e58cf5f48"

I also use geth1.9.22

@datafatmunger
Copy link
Author

datafatmunger commented Oct 14, 2020

Maybe something in the genesis.json?
https://gist.github.com/04f9a03b7f5675115cfef6c1f1dd1faf

@beyonderyue
Copy link

You can call test.getAddr() several times... after a new block mined

@beyonderyue
Copy link

Maybe something in the genesis.json?
https://gist.github.com/04f9a03b7f5675115cfef6c1f1dd1faf

A normal gensis file...

@datafatmunger
Copy link
Author

You can call test.getAddr() several times... after a new block mined

Ah, now we are getting somewhere ... value is there. Can you share the contract you used for the abi, bin in your example?

@beyonderyue
Copy link

I use your contract...

pragma solidity >=0.4.22 <0.6.0;
contract Test {

  address lastAddr;

  function addPost(string memory title, string memory description) public {
    //lastAddr = address(0x79D9A20F9A24f4F52da3930F9B3E84144A209E35); // Works
    lastAddr = msg.sender; // Throws exception
  }

  function getAddr() public view returns (address) {
    return lastAddr; // This always returns 0x0000000000000000000000000000000000000000, but likely because it throws before it's set in the last function
  }
}

@datafatmunger
Copy link
Author

Almost ... :-) pragma solidity >=0.4.22 <0.6.0; ... different compiler. Let me try an older compiler.

@datafatmunger
Copy link
Author

Okay ... yes, everything works perfect with my 0.5.13 compiler ... it DOES NOT work with 0.7.3. Both the bin and abi files are different .... so I'm not totally sure where it's going wrong.

@beyonderyue
Copy link

OK, maybe need check 0.7 change list...

@datafatmunger
Copy link
Author

It's the abi ... one second, I'm diff'ing the files.

@datafatmunger
Copy link
Author

datafatmunger commented Oct 14, 2020

Looks like 2 things ... missing in the 0.7.3 abi one of which would "fix" the issue ...
Both methods are missing ... "constant": false, and "constant": true, respectively THIS FIXES IT! ... and both are missing "payable": false,, BUT this does not effect if it works or not. 🙃

@beyonderyue
Copy link

It's not relate to the version of solidity..
If you want call the function of set, you should use follows:
instance.set({from: eth.accounts[0]}) instead of instance.set.call(...

@beyonderyue
Copy link

My result:

> Contract mined! Address: 0xb9147fe22c603234479cfe286b6689f4a233c8aa
Current val: 0x0000000000000000000000000000000000000000
Gas: 41990
RESULT: 0x40a34274fb811cfa0de2c994c9b4282e58cf5f48
ERROR: null
Current ---0x0000000000000000000000000000000000000000
RESULT ---0x40a34274fb811cfa0de2c994c9b4282e58cf5f48

>
>
> instance.get.call()
"0x0000000000000000000000000000000000000000"
> instance.get.call()
"0x0000000000000000000000000000000000000000"
>
> instance.set({from: eth.accounts[0]})
"0xeae1327e42503f90a618fee450883e94ce894da3d4331a49982b582608823f43"
> instance.get.call()
"0x0000000000000000000000000000000000000000"
> instance.get.call()
"0x40a34274fb811cfa0de2c994c9b4282e58cf5f48"
> instance.get.call()
"0x40a34274fb811cfa0de2c994c9b4282e58cf5f48"

@datafatmunger
Copy link
Author

Well this was sort of helpful, in that ... it indicated I was not on the right track after all ... I circled back ... I started looking at web3 instead, and found the gas estimation was incorrect ... and then landed here: web3/web3.js#3456 ...

So basically, it seems if I do not provide {from: address ... for call() or estimateGas(), stuff simply "doesn't work", specifically Error: Transaction has been reverted by the EVM and TransactionRevertedWithoutReasonError.

This thread can be closed for now.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants