2019-10-03 09:21:28 +00:00
|
|
|
import
|
2019-11-05 18:16:10 +00:00
|
|
|
os, strutils, options, json,
|
2019-12-10 00:18:47 +00:00
|
|
|
chronos, nimcrypto, confutils, web3, stint,
|
2019-10-03 09:21:28 +00:00
|
|
|
eth/keys
|
|
|
|
|
2019-11-05 18:16:10 +00:00
|
|
|
# Compiled version of /scripts/depositContract.v.py in this repo
|
|
|
|
# The contract was compiled in Remix (https://remix.ethereum.org/) with vyper (remote) compiler.
|
|
|
|
const contractCode = "0x740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a052341561009857600080fd5b336003556101406000601f818352015b600061014051602081106100bb57600080fd5b600260c052602060c020015460208261016001015260208101905061014051602081106100e757600080fd5b600260c052602060c020015460208261016001015260208101905080610160526101609050602060c0825160208401600060025af161012557600080fd5b60c0519050606051600161014051018060405190131561014457600080fd5b809190121561015257600080fd5b6020811061015f57600080fd5b600260c052602060c02001555b81516001018083528114156100a8575b505061129656600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a052600015610277575b6101605261014052600061018052610140516101a0526101c060006008818352015b61018051600860008112156100da578060000360020a82046100e1565b8060020a82025b905090506101805260ff6101a051166101e052610180516101e0516101805101101561010c57600080fd5b6101e0516101805101610180526101a0517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86000811215610155578060000360020a820461015c565b8060020a82025b905090506101a0525b81516001018083528114156100bd575b50506018600860208206610200016020828401111561019357600080fd5b60208061022082610180600060046015f15050818152809050905090508051602001806102c0828460006004600a8704601201f16101d057600080fd5b50506102c05160206001820306601f82010390506103206102c0516008818352015b826103205111156102025761021e565b6000610320516102e001535b81516001018083528114156101f2575b50505060206102a05260406102c0510160206001820306601f8201039050610280525b6000610280511115156102535761026f565b602061028051036102a001516020610280510361028052610241565b610160515650005b63c5f2892f600051141561050957341561029057600080fd5b6000610140526101405161016052600154610180526101a060006020818352015b60016001610180511614156103325760006101a051602081106102d357600080fd5b600060c052602060c02001546020826102400101526020810190506101605160208261024001015260208101905080610240526102409050602060c0825160208401600060025af161032457600080fd5b60c0519050610160526103a0565b6000610160516020826101c00101526020810190506101a0516020811061035857600080fd5b600260c052602060c02001546020826101c0010152602081019050806101c0526101c09050602060c0825160208401600060025af161039657600080fd5b60c0519050610160525b61018060026103ae57600080fd5b60028151048152505b81516001018083528114156102b1575b505060006101605160208261046001015260208101905061014051610160516101805163806732896102e05260015461030052610300516006580161009b565b506103605260006103c0525b6103605160206001820306601f82010390506103c0511015156104355761044e565b6103c05161038001526103c0516020016103c052610413565b61018052610160526101405261036060088060208461046001018260208501600060046012f150508051820191505060006018602082066103e0016020828401111561049957600080fd5b60208061040082610140600060046015f150508181528090509050905060188060208461046001018260208501600060046014f150508051820191505080610460526104609050602060c0825160208401600060025af16104f957600080fd5b60c051905060005260206000f350005b63621fd130600051141561061c57341561052257600080fd5b63806732896101405260015461016052610160516006580161009b565b506101c0526000610220525b6101c05160206001820306601f82010390506102205110151561056d57610586565b610220516101e00152610220516020016102205261054b565b6101c0805160200180610280828460006004600a8704601201f16105a957600080fd5b50506102805160206001820306601f82010390506102e0610280516008818352015b826102e05111156105db576105f7565b60006102e0516102a001535b81516001018083528114156105cb575b5050506020610260526040610280510160206001820306601f8201039050610260f350005b632289511860005114156110d957605060043560040161014037603060043560040135111561064a57600080fd5b60406024356004016101c037602060243560040135111561066a57600080fd5b60806044356
|
2019-10-03 09:21:28 +00:00
|
|
|
|
|
|
|
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"
|
2019-11-11 14:43:12 +00:00
|
|
|
name: "web3-url" }: string
|
2019-10-29 00:20:47 +00:00
|
|
|
|
2019-10-03 09:21:28 +00:00
|
|
|
privateKey* {.
|
2019-10-29 00:20:47 +00:00
|
|
|
defaultValue: ""
|
2019-11-11 14:43:12 +00:00
|
|
|
desc: "Private key of the controlling account"
|
|
|
|
name: "private-key" }: string
|
2019-10-03 09:21:28 +00:00
|
|
|
|
|
|
|
case cmd* {.command.}: StartUpCommand
|
|
|
|
of deploy:
|
|
|
|
discard
|
|
|
|
|
|
|
|
of drain:
|
|
|
|
contractAddress* {.
|
2019-10-29 00:20:47 +00:00
|
|
|
defaultValue: ""
|
2019-11-11 14:43:12 +00:00
|
|
|
desc: "Address of the contract to drain"
|
|
|
|
name: "deposit-contract" }: string
|
2019-10-03 09:21:28 +00:00
|
|
|
|
|
|
|
of sendEth:
|
2019-11-11 14:43:12 +00:00
|
|
|
toAddress {.name: "to".}: string
|
|
|
|
valueEth {.name: "eth".}: string
|
2019-10-03 09:21:28 +00:00
|
|
|
|
|
|
|
contract(Deposit):
|
|
|
|
proc drain()
|
|
|
|
|
|
|
|
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-30 13:18:55 +00:00
|
|
|
let receipt = await web3.getMinedTransactionReceipt(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()
|
2019-11-22 15:47:08 +00:00
|
|
|
doAssert(accounts.len > 0)
|
2019-10-03 09:21:28 +00:00
|
|
|
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))
|
2019-11-05 18:16:10 +00:00
|
|
|
discard await sender.drain().send(gasPrice = 1)
|
2019-10-03 09:21:28 +00:00
|
|
|
|
|
|
|
of StartUpCommand.sendEth:
|
|
|
|
echo "0x", await sendEth(web3, cfg.toAddress, cfg.valueEth.parseInt)
|
|
|
|
|
|
|
|
when isMainModule: waitFor main()
|