CENNZnet ethereum bridge contracts.
CENNZnet Bridge
Maintains the active and historic set of CENNZnet validator public keys / addresses
Provides external verifyMessage
to allow other contracts to prove messages were signed by CENNZnet validators
ERC20 Peg
Manages a Generic Asset - ERC20 peg using the CENNZnet ethereum bridge.
Deposited ERC20 tokens (and native Eth) are claimable on CENNZnet for GA equivalents.
Withdrawing GA equivalents requires a signed proof from CENNZnet validators.
// deployed contract instances
const MAINNET_V1 = {
bridge: "0x369e2285CCf43483e76746cebbf3d1d6060913EC",
peg: "0x8F68fe02884b2B05e056aF72E4F2D2313E9900eC",
};
const MAINNET_V2 = {
bridge: "0xf7997B93437d5d2AC226f362EBF0573ce7a53930",
peg: "0x76BAc85e1E82cd677faa2b3f00C4a2626C4c6E32",
};
const KOVAN_V1 = {
bridge: "0x9AFe4E42d8ab681d402e8548Ee860635BaA952C5",
peg: "0x5Ff2f9582FcA1e11d47e4e623BEf4594EB12b30d",
};
const KOVAN_V2 = {
bridge: "0x6484A31Df401792c784cD93aAAb3E933B406DdB3",
peg: "0xa39E871e6e24f2d1Dd6AdA830538aBBE7b30F78F",
wcennz: "0xB7e26f93211932865430a03236Dd043F7248993b,"
};
const ROPSTEN_V1 = {
bridge: "0x25b53B1bDc5F03e982c383865889A4B3c6cB98AA",
peg: "0x927a710681B63b0899E28480114Bf50c899a5c27",
};
const ROPSTEN_V2 = {
bridge: "0x452b8dd7b00D51e48cEF6254a48B7426d44658B8",
peg: "0x4C411B3Bf36D6DE908C6f4256a72B85E3f2B00bF",
wcennz: "0x673F0244bd0AEbd9918ef089f75C503Df9bfBb38",
}
start a CENNZnet validator node.
docker run -d \
-p 9944:9944 \
cennznet/cennznet:2.0.0 \
--dev --tmp \
--unsafe-rpc-external \
--unsafe-ws-external \
--eth-http=http://localhost:8545 # the local hardhat node RPC endpoint
start a hardhat Ethereum node and deploy contracts
# start dev node
npx hardhat node
# deploy contracts
yarn deploy
# run a test eth deposit
yarn eth_e2e
To start a relayer service locally you need:
-
To run local rabbitMQ. installation steps here
-
To run local mongodb. installation steps here
-
Ensure you have env vars set:
MSG_QUEUE_NETWORK=local
RABBIT_URL=amqp://localhost:5672
MONGO_URI=mongodb://127.0.0.1:27017/bridgeDbNikau
yarn publish CONTRACT_ADDRESS ARGS
# transaction status api server
docker run -p 3000:3000 \
-e MONGO_URI="mongo+srv://<username>:<password>/bridgeDb" \
cennznet/bridge-relayer yarn run api
# depositClaim relayer pub/sub
docker run -e MONGO_URI="mongo+srv://<username>:<password>/bridgeDb" \
-e NETWORK="rata|nikau|azalea" \
-e PEG_CONTRACT="0x...." \
-e CENNZNET_SECRET="0x12312321 | //<uri>" \
-e SLACK_SECRET="......" \
-e ETH_ACCOUNT_KEY="0x..." \
cennznet/bridge-relayer yarn run claimRelayer ropsten|kovan|mainnet --state publisher|subscriber
# Eth Event poller
yarn run ethEventPoller --interval 10 --state withdraw|deposit
# validator set relayer
docker run \
-e NETWORK="rata|nika|azalea" \
-e BRIDGE_CONTRACT="0x123123....." \
-e CENNZNET_SECRET="0x12312321 | //<uri>" \
-e SLACK_SECRET="...." \
cennznet/bridge-relayer yarn run validatorRelayer ropsten|kovan|mainnet
# install
yarn
# compile
yarn build
# test
yarn test
deploy bridge contract locally
# start local Eth node
npx hardhat node
# deploy contracts and issue a test deposit
yarn deploy
yarn deploy
will send a test deposit of 123
to CENNZnet address: 0xacd6118e217e552ba801f7aa8a934ea6a300a5b394e7c3f42cd9d6dd9a457c10
e.g.
eth_sendTransaction
Contract call: CENNZnetBridge#deposit
Transaction: 0xbf36caa71a9c2b6e6713e1ebfa831c870d3bc63e5db297837fbc0bd2ed2f9f89
From: 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266
To: 0x5fbdb2315678afecb367f032d93f642f64180aa3
Value: 0 ETH
Gas used: 52014 of 67048
Block #5: 0x6ed3fe2ccc6746012d0bd6d2f36ce5026088357f716bd48f21518a020682c217
Example CENNZnet account for accepting ERC20 deposits
subkey inspect //BridgeTest
Secret Key URI `//BridgeTest` is account:
Secret seed: 0x98e231c854da2ff30765b6b547197c3455be59b31dabeb092e05fdb97ba90b96
Public key (hex): 0xacd6118e217e552ba801f7aa8a934ea6a300a5b394e7c3f42cd9d6dd9a457c10
Account ID: 0xacd6118e217e552ba801f7aa8a934ea6a300a5b394e7c3f42cd9d6dd9a457c10
SS58 Address: 5FyKggXKhqAwJ2o9oBu8j3WHbCfPCz3uCuhTc4fTDgVniWNU
example ERC20 deposit event
[
{
// erc20 contract
"address": "0x458E4CE1Ee5f8E393006c797aa4D8c490CD57e6D",
"topics": [
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
"0x00000000000000000000000072d1b5d3fc22d2be6e1076435a11fe9863d8aeb2",
"0x00000000000000000000000035e752f4ea0645ef8793b37b5757573ede504c47"
],
"data": "0x0000000000000000000000000000000000000000000000000000000000003039",
"blockNumber": 21,
"transactionHash": "0xb2e5dbebff2f44503b2514ce2254899180e4244942af68def94ba45dcfa7a84a",
"transactionIndex": 0,
"blockHash": "0xb1dc17eaea52ccb042ef3daf404c34ab9a21eacd8fa471573a8b3e760a25776f",
"logIndex": 0,
"removed": false,
"id": "log_b0a63c48"
},
{
// erc20 contract
"address": "0x458E4CE1Ee5f8E393006c797aa4D8c490CD57e6D",
"topics": [
"0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925",
"0x00000000000000000000000072d1b5d3fc22d2be6e1076435a11fe9863d8aeb2",
"0x00000000000000000000000035e752f4ea0645ef8793b37b5757573ede504c47"
],
"data": "0x000000000000000000000000000000000000000000000000000000000001b207",
"blockNumber": 21,
"transactionHash": "0xb2e5dbebff2f44503b2514ce2254899180e4244942af68def94ba45dcfa7a84a",
"transactionIndex": 0,
"blockHash": "0xb1dc17eaea52ccb042ef3daf404c34ab9a21eacd8fa471573a8b3e760a25776f",
"logIndex": 1,
"removed": false,
"id": "log_f8ea2071"
},
{
// bridge contract
"address": "0x35e752f4Ea0645Ef8793B37B5757573EdE504c47",
"topics": [
"0x260e406acb5c2890984616f2069afabc0e70de193cd93377cbe69426ef5334c5",
"0x00000000000000000000000072d1b5d3fc22d2be6e1076435a11fe9863d8aeb2"
],
"data": "0x000000000000000000000000458e4ce1ee5f8e393006c797aa4d8c490cd57e6d0000000000000000000000000000000000000000000000000000000000003039acd6118e217e552ba801f7aa8a934ea6a300a5b394e7c3f42cd9d6dd9a457c1",
"blockNumber": 21,
"transactionHash": "0xb2e5dbebff2f44503b2514ce2254899180e4244942af68def94ba45dcfa7a84a",
"transactionIndex": 0,
"blockHash": "0xb1dc17eaea52ccb042ef3daf404c34ab9a21eacd8fa471573a8b3e760a25776f",
"logIndex": 2,
"removed": false,
"id": "log_671685bd"
}
]
ensure contract address in module matches deployed
-> @cennznet/api branch with latest metadata and types yarn build:release
@cennznet/types: npm link @cennznet/api: npm link && npm link @cennznet/types cennznet/cli: npm link @cennznet/api
replace 'rxjs/operators' with 'rxjs/operators/index.js' in packages/api/build/
cennznet: 0x1215b4Ec8161b7959A115805bf980e57A085c3E5 yolo: 0xbe4d356d1C68E22aFeE70B4510ec8b31e389c759
let depositTxHash = "0xbf36caa71a9c2b6e6713e1ebfa831c870d3bc63e5db297837fbc0bd2ed2f9f89";
let claim = {
tokenAddress: "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
amount: "123",
beneficiary: "0xacd6118e217e552ba801f7aa8a934ea6a300a5b394e7c3f42cd9d6dd9a457c10"
};
let result = await api.tx.erc20Peg.depositClaim(depositTxHash, claim).signAndSend(toyKeyring.alice);
request
curl localhost:8545 \
-X POST \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params": ["0x185e85beb3296c7339954811cc682e3f992573ad3eecd37409e0ed763448d303"],"id":1}'
response
{"jsonrpc":"2.0","id":1,"result":{"blockHash":"0xa97fa85e0f38526be39a29eb77c07ad9f18c315f8eb6ab7d44028581c1518ec1","blockNumber":"0x5","contractAddress":null,"cumulativeGasUsed":"0x1685c","effectiveGasPrice":"0x30cb962f","from":"0xec2c80a819ee8e42c624f6a5de930e8184c0801f","gasUsed":"0x1685c","logs":[{"address":"0x17c54edee4d6bccf2379daa328dcc0fbd9c6ce2b","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000ec2c80a819ee8e42c624f6a5de930e8184c0801f","0x00000000000000000000000087015d61b82a3808d9720a79573bf75deb8a1e90"],"data":"0x000000000000000000000000000000000000000000000000000000000000007b","blockNumber":"0x5","transactionHash":"0x185e85beb3296c7339954811cc682e3f992573ad3eecd37409e0ed763448d303","transactionIndex":"0x0","blockHash":"0xa97fa85e0f38526be39a29eb77c07ad9f18c315f8eb6ab7d44028581c1518ec1","logIndex":"0x0","removed":false},{"address":"0x17c54edee4d6bccf2379daa328dcc0fbd9c6ce2b","topics":["0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925","0x000000000000000000000000ec2c80a819ee8e42c624f6a5de930e8184c0801f","0x00000000000000000000000087015d61b82a3808d9720a79573bf75deb8a1e90"],"data":"0x000000000000000000000000000000000000000000000000000000000001e1c5","blockNumber":"0x5","transactionHash":"0x185e85beb3296c7339954811cc682e3f992573ad3eecd37409e0ed763448d303","transactionIndex":"0x0","blockHash":"0xa97fa85e0f38526be39a29eb77c07ad9f18c315f8eb6ab7d44028581c1518ec1","logIndex":"0x1","removed":false},{"address":"0x87015d61b82a3808d9720a79573bf75deb8a1e90","topics":["0x76bb911c362d5b1feb3058bc7dc9354703e4b6eb9c61cc845f73da880cf62f61","0x000000000000000000000000ec2c80a819ee8e42c624f6a5de930e8184c0801f"],"data":"0x00000000000000000000000017c54edee4d6bccf2379daa328dcc0fbd9c6ce2b000000000000000000000000000000000000000000000000000000000000007bacd6118e217e552ba801f7aa8a934ea6a300a5b394e7c3f42cd9d6dd9a457c10","blockNumber":"0x5","transactionHash":"0x185e85beb3296c7339954811cc682e3f992573ad3eecd37409e0ed763448d303","transactionIndex":"0x0","blockHash":"0xa97fa85e0f38526be39a29eb77c07ad9f18c315f8eb6ab7d44028581c1518ec1","logIndex":"0x2","removed":false}],"logsBloom":"0x00000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000010000000200200000000000000000000000008000000000000000000000000000000000000000000000000000000001000000000000000000000000010000000000010000000800000000000000000000000000002000000000000000000000000000040000000020000000000000000000010000000000000000000000000000000000000000000000002000000000000000000000000200000000000008000000004000000000010001000000000000000020000000000000000000000000000001000000000","status":"0x1","to":"0x87015d61b82a3808d9720a79573bf75deb8a1e90","transactionHash":"0x185e85beb3296c7339954811cc682e3f992573ad3eecd37409e0ed763448d303","transactionIndex":"0x0","type":"0x0"}}