https://github.com/archethic-foundation/bridge-contracts
Smart contracts for Archethic's Bridge
https://github.com/archethic-foundation/bridge-contracts
Last synced: 14 days ago
JSON representation
Smart contracts for Archethic's Bridge
- Host: GitHub
- URL: https://github.com/archethic-foundation/bridge-contracts
- Owner: archethic-foundation
- License: agpl-3.0
- Created: 2023-09-19T12:58:20.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2024-05-28T15:36:41.000Z (about 1 year ago)
- Last Synced: 2024-05-29T04:15:36.457Z (about 1 year ago)
- Language: JavaScript
- Homepage:
- Size: 163 KB
- Stars: 1
- Watchers: 4
- Forks: 0
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# bridge-contracts
EVM & Archethic smart contract for Archethic's Bridge## Development
In order to develop and test the contracts, you need to have some prerequisites:- Node.js
- EVM:
- [Hardhat](https://hardhat.org/)- Archethic:
- Archethic node (running in devnet mode)
### Installation
```bash
npm install --prefix evm
npm install --prefix archethic
```## EVM contracts
There are different kind of EVM smart contracts:
- HTLC
- Liquidity poolsAll the contract have their own type depending on the token used: native or ERC, because transfers/balance verification acts differently.
### Audit of EVM Smart Contracts
Our EVM smart contracts have been audited by [Hacken](https://hacken.io), a recognized leader in blockchain security. The full audit report is available [here](https://wiki.archethic.net/assets/files/Hacken_Archethic_[SCA]%20Archethic%20_%20Bridge-Contracts%20_%20June2024_P-2024-692_1_20240722%2011_07-30521586ca69963b7d512e27e98e0ab3.pdf).
### HTLC
Those contract provide the atomic swap logic.
There are few types
- Signed: contract where a signature from the Archethic's pool is required to provision the contract or to withdraw funds
- Chargeable: contract where a fee is defined and in which the pool is assigning the recipient```mermaid
classDiagram
HTLC <|-- HTLC_ERC
HTLC <|-- HTLC_ETH
HTLC_ERC <|-- SignedHTLC_ERC
HTLC_ERC <|-- ChargeableHTLC_ERC
HTLC_ETH <|-- SignedHTLC_ETH
HTLC_ETH <|-- ChargeableHTLC_ETH
```### Liquidity pools contracts
```mermaid
classDiagram
Pool <|-- LP_ERC
Pool <|-- LP_ETH
```### Test SC
```bash
cd evm
```For tests you can use unit tests:
```bash
npm run test
```To use the pool in a local environment you can use migrations with:
```bash
npm run start-node
```
```bash
npm run deploy
```You can use script to fill the pools
```bash
npm run fill-erc
npm run fill-eth
```You can also use script to deploy chargeable HTLC contract
```bash
npx hardhat run scripts/fixture/create_erc_chargeable_htlc.js --network localhost
npx hardhat run scripts/fixture/create_eth_chargeable_htlc.js --network localhost
npx hardhat run scripts/fixture/reveal_chargeable_secret.js --network localhost
```This will create two pools for ETH and ERC.
It will also create a dummy token, accessible via `LP_ERC.token()`### Analytics
In order to run some analytics from the pools, there are two scripts to run:
- UCO pool:
This script will give swap statistics from the ERC pool using the chargeable and signed HTLC contracts.
```bash
npx hardhat run scripts/analytics/uco_bridged.js --network sepolia
```- ETH/MATIC/BSC pool:
This script will give swap statistics from the ETH pool using the chargeable and signed HTLC contracts.
```bash
npx hardhat run scripts/analytics/coin_bridged.js --network sepolia
```## Archethic Smart Contracts
There is three kind of SC:
- Factory contract
- HTLC
- Pool contracts### Factory contract
This contract is a helper for DApps UI and for Pool contracts to build and verify HTLC. It also helps Pool contracts for minting new tokens.
Here is the public functions:
- `get_chargeable_htlc(end_time, user_address, pool_address, secret_hash, token, amount)`
It returns the code of a HTLC for fund going from EVM chain => Archethic
- `end_time`: the limit timestamp for the swap provided by EVM contracts
- `user_address`: the destination address on Archethic
- `pool_address`: the address of the Archethic pool to request funds
- `secret_hash`: the hash of the secret generated by user
- `token`: the token address to swap or "UCO"
- `amount`: the amount of token the user wants to receive on Archethic- `get_signed_htlc(user_address, pool_address, token, amount)`
It returns the code of a HTLC for fund going from Archehtic => EVM chain
- `user_address`: the user address on Archethic
- `pool_address`: the address of the Archethic pool to request secret
- `token`: the token address to swap or "UCO"
- `amount`: the amount of token the user wants to receive on EVM chain- `get_protocol_fee`
It returns the protocol fees in percentage (0.3 => 0.3% = 0.003)- `get_protocol_fee_address`
It returns the address where the protocol fees are sent### HTLC
Those contracts implement the logic of atomic swap. There is two types of contracts:
- Chargeable HTLC: used when swapping from EVM chain to Archethic.
On creation, this contract needs to request funds to a pool. To do it the transaction that contains the code should also add the pool in the recipient with the parameters end_time, amount, user_address, secret_hash.
Actions:
- `reveal_secret(secret)`: reveal the secret and withdraw the fund if secret match- Signed HTLC: use when swapping from Archethic to EVM chain.
Public functions:
- `get_htlc_data`: After provisioning, this contract will expose this function which provide the needed data to create the HTLC contract on EVM side. It returns the endtime, the secret_hash and the secret_hash_signature.
- `get_secret`: After withdraw, this contract will expose this funtion which provide the needed data to withdraw the contract on EVM side. It returns the secret and the secret_signature### Pool Contracts
Those contract are responsible for creating new tokens and signing action to make a proof for EVM chain that actions has been done on Archethic.
There is one contract version for token and one for UCO.
This contract provides these actions:
- `request_funds(end_time, amount, user_address, secret_hash)`: This actions should be triggered on the chargeable htlc creation. It ensure the HTLC contract is valid and send the requested funds to the HTLC
- `request_secret_hash(htlc_genesis_address, amount, user_address, chain_id)`: This actions should be triggered by the user that already created a signed HTLC. In the trigger transaction, the user must add a transfer to the HTLC contract that contains the needed fund for the swap. The pool will ensure the contract is a valid one and the transfer correspond to the swap parameter, and then generate a new secret with a signature and send them to the HTCL contract
- `reveal_secret(htlc_genesis_address)`: This actions, should be triggered by the user. The pool will send the secret to the HTLC contract so it can withdraw.
- `update_pool(new_code)`: This action is used to update the pool code. It can be triggered only from the Master chain of the bridge### Script example
To help interaction with smart contracts, some helper scripts are available in js.
A `bridge.js` script can be used as entry point for any commands.
A `config.js` file is provided to configure the environment with `endpoint`, `availableEvmNetworks````bash
cd archethic
``````bash
node bridge --helpCommands:
bridge deploy_pool Deploy a pool
bridge deploy_factory Deploy the factory
bridge update_pool Update an existing pool
bridge init_keychain Initialize the bridge keychain with the primary services
bridge deploy_chargeable_htlc Deploy a chargeable HTLC to swap from EVM to Ar chethic
bridge deploy_signed_htlc Deploy a signed HTLC to swap from Archethic to EVM
bridge reveal_secret Reveal a secret to an HTLC contract when swappi ng from EVM to Archethic
bridge provision_htlc Provision a signed HTLC address and request the pool the create a secret
bridge request_secret Request a pool to reveal the secret for a HTLC contract
Options:
--version Show version number [boolean]
--help Show help [boolean]
```#### Setup bridge contracts
##### Initialize the keychain if not already existing
```bash
node bridge init_keychain --helpInitialize the bridge keychain with the primary services
Options:
--access_seed The Keychain access seed (default in env config) [string]
--env The environment config to use (default to local) [string]
```
```bash
node bridge init_keychain
```
##### Create factory contract
To update factory contract the same command can be used
```bash
node bridge deploy_factory --helpDeploy the factory
Options:
--access_seed The Keychain access seed (default in env config) [string]
--env The environment config to use (default to local) [string]
```
```bash
node bridge deploy_factory
```
##### Deploy a pool
```bash
node bridge deploy_pool --helpDeploy a pool
Options:
--token The token to create a pool, UCO or token symbol [string] [required]
--access_seed The Keychain access seed (default in env config) [string]
--env The environment config to use (default to local) [string]
```
```bash
node bridge deploy_pool --token UCO
node bridge deploy_pool --token aeETH
```
##### Update a pool's code
```bash
node bridge update_pool --helpUpdate an existing pool
Options:
--token The token of the pool to update, UCO or token symbol [string] [required]
--access_seed the keychain access seed (default in env config) [string]
--env The environment config to use (default to local) [string]
```
```bash
node bridge update_pool --token UCO
```#### Swap EVM => Archethic
First deploy HTLC contract on EVM
##### Deploy chargeable HTLC contract
```bash
node bridge deploy_chargeable_htlc --helpDeploy a chargeable HTLC to swap from EVM to Archethic
Options:
--token The token to receive on Archethic [string] [required]
--seed The seed to use for create the HTLC contract [string] [required]
--endtime The end time provided by the EVM contract [required]
--amount The amount to receive from the swap [required]
--secret_hash The hash of the secret [string] [required]
--access_seed the keychain access seed (default in env config) [string]
--env The environment config to use (default to local) [string]
```
```bash
node bridge.js deploy_chargeable_htlc --token UCO --seed htlc1 --endtime 1696934940 --amount 14.35 --secret_hash 31f7a65e315586ac198bd798b6629ce4903d0899476d5741a9f32e2e521b6a66
```
Withdraw on EVM##### Reveal secret
```bash
bridge reveal_secret --helpReveal a secret to an HTLC contract when swapping from EVM to Archethic
Options:
--htlc_address The address of the HTLC contract [string] [required]
--secret The secret allowing the contract to withdraw [string] [required]
--env The environment config to use (default to local) [string]
```
```bash
node bridge reveal_secret 0000b900c36b959d1b2eb52db6237e5130fe07a022e17e671656065d1b5e56bda713 toto
```#### Archethic => EVM
##### Deploy signed HTLC
```bash
node bridge deploy_signed_hltc --helpDeploy a signed HTLC to swap from Archethic to EVM
Options:
--token The token to send to EVM [string] [required]
--seed The seed to use for create the HTLC contract [string] [required]
--amount The amount to send to the swap [required]
--access_seed the keychain access seed (default in env config) [string]
--env The environment config to use (default to local) [string]
```
```bash
node bridge deploy_signed_htlc --token UCO --seed htlc1 --amount 5.356
```##### Provision HTLC
```bash
node bridge provision_htlc --helpProvision a signed HTLC address and request the pool the create a secret
Options:
--token The token to send to the htlc contract [string] [required]
--htlc_address The genesis address of the HTLC contract to provision [string] [required]
--amount The amount to send to the htlc contract [required]
--chainID The chain ID of the destination EVM blockchain
--access_seed the keychain access seed (default in env config) [string]
--env The environment config to use (default to local) [string]
``````bash
node bridge provision_htlc --token UCO --htlc_address 0000b900c36b959d1b2eb52db6237e5130fe07a022e17e671656065d1b5e56bda713 --amount 5.356
```Create EVM contract on EVM using data provided by HTLC function `get_htlc_data`
##### Request secret to the pool
```bash
node bridge request_secret --helpRequest a pool to reveal the secret for a HTLC contract
Options:
--token The token of the pool (used to retrieve pool address) [string] [required]
--htlc_address The genesis address of the HTLC contract [string] [required]
--access_seed the keychain access seed (default in env config) [string]
--env The environment config to use (default to local) [string]
```
```bash
node bridge.js request_secret --token UCO --htlc_address 0000b900c36b959d1b2eb52db6237e5130fe07a022e17e671656065d1b5e56bda713
```