2019-10-03 09:21:28 +00:00
import
os , ospaths , strutils , strformat , options , json ,
chronos , nimcrypto , confutils , web3 , stint ,
eth / keys
# https://github.com/ethereum/eth2.0-specs/blob/master/deposit_contract/contracts/validator_registration.v.py as of d1fe8f16fd4449cbf766d4ef2484b0891c04be58
const contractCode = " 0x740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a052341561009857600080fd5b336002556101406000601f818352015b600061014051602081106100bb57600080fd5b600360c052602060c020015460208261016001015260208101905061014051602081106100e757600080fd5b600360c052602060c020015460208261016001015260208101905080610160526101609050602060c0825160208401600060025af161012557600080fd5b60c0519050606051600161014051018060405190131561014457600080fd5b809190121561015257600080fd5b6020811061015f57600080fd5b600360c052602060c02001555b81516001018083528114156100a8575b50506112c756600436101561000d5761113e565b600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a052600015610286575b6101605261014052600061018052610140516101a0526101c060006008818352015b61018051600860008112156100e8578060000360020a82046100ef565b8060020a82025b905090506101805260ff6101a051166101e052610180516101e0516101805101101561011a57600080fd5b6101e0516101805101610180526101a0517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86000811215610163578060000360020a820461016a565b8060020a82025b905090506101a0525b81516001018083528114156100cb575b5050601860086020820661020001602082840111156101a157600080fd5b60208061022082610180600060046015f15050818152809050905090508051602001806102c0828460006004600a8704601201f16101de57600080fd5b50506102c05160206001820306601f82010390506103206102c0516020818352015b82610320511015156102115761022d565b6000610320516102e001535b8151600101808352811415610200575b50505060206102a05260406102c0510160206001820306601f8201039050610280525b6000610280511115156102625761027e565b602061028051036102a001516020610280510361028052610250565b610160515650005b63863a311b600051141561051857341561029f57600080fd5b6000610140526101405161016052600154610180526101a060006020818352015b60016001610180511614156103415760006101a051602081106102e257600080fd5b600060c052602060c02001546020826102400101526020810190506101605160208261024001015260208101905080610240526102409050602060c0825160208401600060025af161033357600080fd5b60c0519050610160526103af565b6000610160516020826101c00101526020810190506101a0516020811061036757600080fd5b600360c052602060c02001546020826101c0010152602081019050806101c0526101c09050602060c0825160208401600060025af16103a557600080fd5b60c0519050610160525b61018060026103bd57600080fd5b60028151048152505b81516001018083528114156102c0575b505060006101605160208261046001015260208101905061014051610160516101805163806732896102e0526001546103005261030051600658016100a9565b506103605260006103c0525b6103605160206001820306601f82010390506103c0511015156104445761045d565b6103c05161038001526103c0516020016103c052610422565b61018052610160526101405261036060088060208461046001018260208501600060046012f150508051820191505060006018602082066103e001602082840111156104a857600080fd5b60208061040082610140600060046015f150508181528090509050905060188060208461046001018260208501600060046014f150508051820191505080610460526104609050602060c0825160208401600060025af161050857600080fd5b60c051905060005260206000f350005b63621fd130600051141561062c57341561053157600080fd5b6380673289610140526001546101605261016051600658016100a9565b506101c0526000610220525b6101c05160206001820306601f82010390506102205110151561057c57610595565b610220516101e00152610220516020016102205261055a565b6101c0805160200180610280828460006004600a8704601201f16105b857600080fd5b50506102805160206001820306601f82010390506102e0610280516020818352015b826102e0511015156105eb57610607565b60006102e0516102a001535b81516001018083528114156105da575b5050506020610260526040610280510160206001820306601f8201039050610260f350005b63c47e300d60005114156110e257605060043560040161014037603060043560040135111561065a57600080fd5b60406024356004016101c0376020602435600401351
type
StartUpCommand {. pure . } = enum
deploy
drain
sendEth
CliConfig = object
depositWeb3Url * {.
2019-10-29 00:20:47 +00:00
desc : " URL of the Web3 server to observe Eth1 "
longform : " web3-url " } : string
2019-10-03 09:21:28 +00:00
privateKey * {.
desc : " Private key of the controlling account " ,
2019-10-29 00:20:47 +00:00
defaultValue : " "
longform : " private-key " } : string
2019-10-03 09:21:28 +00:00
case cmd * {. command . } : StartUpCommand
of deploy :
discard
of drain :
contractAddress * {.
desc : " Address of the contract to drain " ,
2019-10-29 00:20:47 +00:00
defaultValue : " "
longform : " deposit-contract " } : string
2019-10-03 09:21:28 +00:00
of sendEth :
2019-10-29 00:20:47 +00:00
toAddress {. longform : " to " . } : string
valueEth {. longform : " eth " . } : string
2019-10-03 09:21:28 +00:00
contract ( Deposit ) :
proc drain ( )
2019-10-25 14:53:31 +00:00
proc getTransactionReceipt ( web3 : Web3 , tx : TxHash ) : Future [ ReceiptObject ] {. async . } =
result = await web3 . provider . eth_getTransactionReceipt ( tx )
2019-10-03 09:21:28 +00:00
proc deployContract * ( web3 : Web3 , code : string ) : Future [ Address ] {. async . } =
var code = code
if code [ 1 ] notin { ' x ' , ' X ' } :
code = " 0x " & code
let tr = EthSend (
source : web3 . defaultAccount ,
data : code ,
gas : Quantity ( 3000000 ) . some ,
gasPrice : 1 . some )
let r = await web3 . send ( tr )
2019-10-25 14:53:31 +00:00
let receipt = await web3 . getTransactionReceipt ( r )
2019-10-03 09:21:28 +00:00
result = receipt . contractAddress . get
proc sendEth ( web3 : Web3 , to : string , valueEth : int ) : Future [ TxHash ] =
let tr = EthSend (
source : web3 . defaultAccount ,
gas : Quantity ( 3000000 ) . some ,
gasPrice : 1 . some ,
value : some ( valueEth . u256 * 1000000000000000000 . u256 ) ,
to : Address . fromHex ( to ) . some )
web3 . send ( tr )
proc main ( ) {. async . } =
let cfg = CliConfig . load ( )
let web3 = await newWeb3 ( cfg . depositWeb3Url )
if cfg . privateKey . len ! = 0 :
web3 . privateKey = initPrivateKey ( cfg . privateKey )
else :
let accounts = await web3 . provider . eth_accounts ( )
assert ( accounts . len > 0 )
web3 . defaultAccount = accounts [ 0 ]
case cfg . cmd
of StartUpCommand . deploy :
let contractAddress = await web3 . deployContract ( contractCode )
echo " 0x " , contractAddress
of StartUpCommand . drain :
let sender = web3 . contractSender ( Deposit , Address . fromHex ( cfg . contractAddress ) )
discard await sender . drain ( ) . send ( )
of StartUpCommand . sendEth :
echo " 0x " , await sendEth ( web3 , cfg . toAddress , cfg . valueEth . parseInt )
when isMainModule : waitFor main ( )