CrossChain-Router

module
v3.6.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 8, 2023 License: GPL-3.0

README

How to deploy router swap

0. compile

requires at least Go version 1.18

make all

run the above command, it will generate ./build/bin/swaprouter binary.

1. deploy AnyswapRouter

deploy a AnyswapRouter contract for each supported blockchain

eg. AnyswapV6Router.sol

2. deploy AnyswapERC20

deploy a AnyswapERC20 contract for each token on each blockchain

eg. AnyswapV6ERC20.sol

eg. AnyswapV6ERC20-NonEVM.sol

3. deploy RouterConfig

deploy a RouterConfig contract to store router bridge configs

eg. RouterConfigV2.sol

4. set router config on chain

call RouterConfig contract to set configs on blcokchain.

The following is the most used functions, please ref. the abi for more info.

4.1 set chain config

call the following contract function:

function setChainConfig(uint256 chainID, string blockChain, string routerContract, uint64 confirmations, uint64 initialHeight, string extra)
4.2 set token config

call the following contract function:

function setTokenConfig(string tokenID, uint256 chainID, string tokenAddr, uint8 decimals, uint256 version, string routerContract, string extra)
4.3 set swap and fee config

we may not set swap and fee config between all fromChainIDs and toChainIDs, and we'll use the following logic to decide the actual config to use.

the actual swap config is decided by the following steps
1. if _swapConfig[tokenID][srcChainID][dstChainID] exist, then use it.
2. else if _swapConfig[tokenID][srcChainID][0] exist, then use it.
3. else if _swapConfig[tokenID][0][dstChainID] exist, then use it.
4. else use _swapConfig[tokenID][0][0].
the actual fee config is decided by the following steps
1. if _feeConfig[tokenID][srcChainID][dstChainID] exist, then use it.
2. else if _feeConfig[tokenID][srcChainID][0] exist, then use it.
3. else if _feeConfig[tokenID][0][dstChainID] exist, then use it.
4. else use _feeConfig[tokenID][0][0].
  1. set swap and fee config in batch
    struct SwapConfig2 {
        uint256 FromChainID;
        uint256 ToChainID;
        uint256 MaximumSwap;
        uint256 MinimumSwap;
        uint256 BigValueThreshold;
    }

    struct FeeConfig2 {
        uint256 FromChainID;
        uint256 ToChainID;
        uint256 MaximumSwapFee;
        uint256 MinimumSwapFee;
        uint256 SwapFeeRatePerMillion;
    }

    function setSwapConfigs(string memory tokenID, SwapConfig2[] calldata configs)
    function setFeeConfigs(string memory tokenID, FeeConfig2[] calldata configs)
  1. query swap and fee config in batch
    function getAllSwapConfigs(string memory tokenID) external view returns (SwapConfig2[] memory)
    function getAllFeeConfigs(string memory tokenID) external view returns (FeeConfig2[] memory)
4.3.1 set swap and fee config meantime

call the following contract function:

function setSwapAndFeeConfig(
        string tokenID, uint256 srcChainID, uint256 dstChainID,
        uint256 maxSwap, uint256 minSwap, uint256 bigSwap,
        uint256 maxFee, uint256 minFee, uint256 feeRate)
4.3.2 set swap config alone

call the following contract function to set swap config:

max/min/big value always uses decimals 18 (like precision).

function setSwapConfig(string tokenID, uint256 srcChainID, uint256 dstChainID, uint256 maxSwap, uint256 minSwap, uint256 bigSwap)

swap config is stored in a map with keys tokenID,srcChainID,dstChainID

mapping (bytes32 => mapping(uint256 => mapping(uint256 => SwapConfig))) private _swapConfig;
4.3.3 set fee config alone

call the following contract function:

rate is per million ration.

max/min value always uses decimals 18 (like precision).

function setFeeConfig(string tokenID, uint256 srcChainID, uint256 dstChainID, uint256 maxFee, uint256 minFee, uint256 feeRate)

fee config is stored in a map with keys tokenID,srcChainID,dstChainID

mapping (bytes32 => mapping(uint256 => mapping(uint256 => FeeConfig))) private _feeConfig;
4.4 set mpc address's public key

call the following contract function:

function setMPCPubkey(address addr, string pubkey);

5. add local config file

please ref. config-example.toml

the following is the major config items:

config item description
Identifier must have prefix 'routerswap'
SwapType eg. erc20swap, nftswap, anycallswap
SwapSubType anycall has subtype of v5 and v6
[Server] only need by swap server
[Server.MongoDB] use mongodb database
[Server.APIServer] provide rpc service
[Oracle] only need by swap oracle
[Extra] extra configs
[OnChain] get onchain router configs in samrt contract
[Gateways] query block and tx info from full nodes' rpc
[MPC] use mpc to do threshold signing

Notation:

the MPC is a security Multi-Party threshold Computation, for more info, please refer FastMulThreshold-DSA

Because the complexity of MPC, we can use private key to sign tx for easy testing.

set the following config items in the [MPC] section:

[MPC]
# use private key instead (use for testing)
SignWithPrivateKey = true

# set signer's private key, key is chain ID (use for testing)
[MPC.SignerPrivateKeys]
4  = "1111111111111111111111111111111111111111111111111111111111111111"
97 = "2222222222222222222222222222222222222222222222222222222222222222"

for more info, please ref. config-sign-with-privatekey-example.toml

6. run swaprouter

# for server run (add '--runserver' option)
setsid ./build/bin/swaprouter --config config.toml --log logs/routerswap.log --runserver

# for oracle run
setsid ./build/bin/swaprouter --config config.toml --log logs/routerswap.log

7. sub commands

get all sub command list and help info, run

./build/bin/swaprouter -h

sub commands:

admin is admin tool

config is tool to process and query config data

8. RPC api

please ref. server rpc api

Directories

Path Synopsis
Package admin provides methods to sign message and to verify signed message
Package admin provides methods to sign message and to verify signed message
Package build provide customized methods to build project.
Package build provide customized methods to build project.
cmd
swaprouter
Command swaprouter is main program to start swap router or its sub commands.
Command swaprouter is main program to start swap router or its sub commands.
utils
Package utils provides common sub commands and command flags.
Package utils provides common sub commands and command flags.
Package common contains various helper functions.
Package common contains various helper functions.
hexutil
Package hexutil implements hex encoding with 0x prefix.
Package hexutil implements hex encoding with 0x prefix.
math
Package math provides integer math utilities.
Package math provides integer math utilities.
internal
build
Package build - build tools nolint
Package build - build tools nolint
Package leveldb - leveldb wrapper nolint
Package leveldb - leveldb wrapper nolint
Package log is a wrapper of logrus.
Package log is a wrapper of logrus.
Package mongodb is a wrapper of mongo-go-driver that defines the collections and CRUD apis on them.
Package mongodb is a wrapper of mongo-go-driver that defines the collections and CRUD apis on them.
Package mpc is a client of mpc server, doing the sign and accept tasks.
Package mpc is a client of mpc server, doing the sign and accept tasks.
Package params provides common version info and config items.
Package params provides common version info and config items.
Package router inits bridges and loads onchain configs.
Package router inits bridges and loads onchain configs.
bridge
Package bridge init router bridge and load / reload configs.
Package bridge init router bridge and load / reload configs.
rpc
client
Package client provides methods to do http GET / POST request.
Package client provides methods to do http GET / POST request.
restapi
Package restapi provides RESTful RPC service.
Package restapi provides RESTful RPC service.
rpcapi
Package rpcapi provides JSON RPC service.
Package rpcapi provides JSON RPC service.
server
Package server provides JSON/RESTful RPC service.
Package server provides JSON/RESTful RPC service.
Package tokens defines the common interfaces and supported bridges in sub directories.
Package tokens defines the common interfaces and supported bridges in sub directories.
aptos/tweetnacl
tweetnacl-go is a port of Dan Bernstein's "crypto library in a 100 tweets" code to the Go language.
tweetnacl-go is a port of Dan Bernstein's "crypto library in a 100 tweets" code to the Go language.
btc
eth
Package eth implements the bridge interfaces to support routering.
Package eth implements the bridge interfaces to support routering.
eth/abicoder
Package abicoder is simple tool to pack datas like solidity abi.
Package abicoder is simple tool to pack datas like solidity abi.
ripple/rubblelabs/ripple/config
Package config provides a simple way of signing submitting groups of transactions for the same account.
Package config provides a simple way of signing submitting groups of transactions for the same account.
ripple/rubblelabs/ripple/data
Package data aims to provides all the data types that are needed to build tools, clients and servers for use on the Ripple network.
Package data aims to provides all the data types that are needed to build tools, clients and servers for use on the Ripple network.
tests/btc
Package eth test eth router by implementing `tokens.IBridge` interface.
Package eth test eth router by implementing `tokens.IBridge` interface.
tests/eth
Package eth test eth router by implementing `tokens.IBridge` interface.
Package eth test eth router by implementing `tokens.IBridge` interface.
tron/abicoder
Package abicoder is simple tool to pack datas like solidity abi.
Package abicoder is simple tool to pack datas like solidity abi.
crypto
Package crypto provides facilities for ecdsa encryption and decryption.
Package crypto provides facilities for ecdsa encryption and decryption.
keystore
Package keystore encrypt private key and save on disk uses JSON encoding.
Package keystore encrypt private key and save on disk uses JSON encoding.
rlp
Package rlp implements the RLP serialization format.
Package rlp implements the RLP serialization format.
Package types - eth types like transaction, receipt and logs nolint
Package types - eth types like transaction, receipt and logs nolint
Package worker includes all the tasks and jobs to process router swaps.
Package worker includes all the tasks and jobs to process router swaps.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL