Skip to content

Commit

Permalink
Merge branch 'main' into test/assertions-version
Browse files Browse the repository at this point in the history
  • Loading branch information
peterpeterparker authored Apr 24, 2024
2 parents cdd3623 + da057c3 commit 5b203e9
Show file tree
Hide file tree
Showing 111 changed files with 2,304 additions and 631 deletions.
9 changes: 9 additions & 0 deletions HACKING.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ This document lists a couple of useful information for development and deploymen

- [Deployment](#deployment)
- [Internationalization](#internationalization)
- [Faucets](#faucets)

## Deployment

Expand Down Expand Up @@ -54,3 +55,11 @@ In the future, Oisy might be extended to support multiple languages on productio
### Adding additional keys

Translations are handled in JSON files but, as we are consuming these through a store, their representation have to exist as interfaces. To ease the process we have developed a script which extracts the declarations automatically. In case you would add new keys, `run npm run i18n` to generate the interfaces.

## Faucets

A list of useful faucets and ERC20 tokens on Sepolia:

- ETH: [Ethereum Sepolia Faucet](https://www.alchemy.com/faucets/ethereum-sepolia) from Alchemy
- USDC: [Circle faucet](https://faucet.circle.com/)
- ERC20: [Weenus 💪 Token Faucet](https://github.com/bokkypoobah/WeenusTokenFaucet)
20 changes: 20 additions & 0 deletions dfx.json
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,26 @@
"staging": "sh5u2-cqaaa-aaaar-qacna-cai"
}
}
},
"ckusdc_ledger": {
"type": "custom",
"candid": "target/ic/cketh_ledger.did",
"wasm": "target/ic/cketh_ledger.wasm",
"remote": {
"id": {
"staging": "yfumr-cyaaa-aaaar-qaela-cai"
}
}
},
"ckusdc_index": {
"type": "custom",
"candid": "target/ic/cketh_index.did",
"wasm": "target/ic/cketh_index.wasm",
"remote": {
"id": {
"staging": "ycvkf-paaaa-aaaar-qaelq-cai"
}
}
}
},
"defaults": {
Expand Down
16 changes: 8 additions & 8 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
"@dfinity/auth-client": "^1.0.1",
"@dfinity/candid": "^1.0.1",
"@dfinity/ckbtc": "^2.3.1",
"@dfinity/cketh": "^2.0.1",
"@dfinity/cketh": "^2.0.1-next-2024-04-23",
"@dfinity/gix-components": "^4.2.0",
"@dfinity/ic-management": "^3.1.1",
"@dfinity/ledger-icp": "^2.2.2",
Expand Down
57 changes: 57 additions & 0 deletions scripts/deploy.ckerc20.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
#!/bin/bash

DFX_NETWORK=local

MINTERID="$(dfx canister id cketh_minter --network "$DFX_NETWORK")"
echo "$MINTERID"

function deploy_ckerc20 {
local LEDGER_CANISTER=$1
local INDEX_CANISTER=$2
local TOKEN_SYMBOL=$3
local TOKEN_NAME=$4
local DECIMALS=$5

echo "Step A: create ledger canisters..."
dfx canister create "$LEDGER_CANISTER" --network "$DFX_NETWORK"

local LEDGERID="$(dfx canister id "$LEDGER_CANISTER" --network "$DFX_NETWORK")"
echo "$LEDGERID"

echo "Step B: deploy ledger canister..."
PRINCIPAL="$(dfx identity get-principal)"

dfx deploy "$LEDGER_CANISTER" --network "$DFX_NETWORK" --argument "(variant {
Init = record {
token_symbol = \"$TOKEN_SYMBOL\";
token_name = \"$TOKEN_NAME\";
decimals = opt $DECIMALS;
max_memo_length = opt 80;
minting_account = record { owner = principal \"$MINTERID\" };
transfer_fee = 9_500;
metadata = vec {};
initial_balances = vec { record { record { owner = principal \"$PRINCIPAL\"; }; 100_000_000_000_000_000_000; }; };
archive_options = record {
num_blocks_to_archive = 10_000;
trigger_threshold = 20_000;
controller_id = principal \"$PRINCIPAL\";
cycles_for_archive_creation = opt 1_000_000_000_000;
max_message_size_bytes = null;
node_max_memory_size_bytes = opt 3_221_225_472;
};
feature_flags = opt record { icrc2 = true };
}
})"

echo "Step C: deploy index canister..."
dfx deploy "$INDEX_CANISTER" --network "$DFX_NETWORK" --argument "(opt variant {
Init = record {
ledger_id = principal \"$LEDGERID\";
}
})"

echo "Step D: transfer ckETH to principal..."
dfx canister call "$LEDGER_CANISTER" --network "$DFX_NETWORK" icrc1_transfer "(record {from=null; to=record { owner= principal \"x4w27-so7wg-cudsa-yy7fh-wcpy5-njul4-q54tv-euzzi-tdnzz-ill46-zqe\";}; amount=500_000_000_000_000_000; fee=null; memo=null; created_at_time=null;})"
}

deploy_ckerc20 ckusdc_ledger ckusdc_index "ckSepoliaUSDC" "Chain key Sepolia USDC" 6
3 changes: 2 additions & 1 deletion scripts/deploy.sh
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@

./scripts/download.cketh.sh
./scripts/deploy.cketh.sh
./scripts/deploy.ckerc20.sh

dfx deploy internet_identity --specified-id rdmx6-jaaaa-aaaaa-aaadq-cai

dfx deploy frontend

2 changes: 1 addition & 1 deletion scripts/download.cketh.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ if [ ! -d "$DIR" ]; then
mkdir "$DIR"
fi

IC_COMMIT="8001dd214e4d6cbab2a68f6da7b931d11a073715"
IC_COMMIT="83462faa39fe9b5c020edd6a3bf2b3660ad19fca"

curl -sSL https://download.dfinity.systems/ic/$IC_COMMIT/canisters/ic-cketh-minter.wasm.gz -o "$DIR"/cketh_minter.wasm.gz
gunzip "$DIR"/cketh_minter.wasm.gz
Expand Down
2 changes: 1 addition & 1 deletion src/frontend/src/app.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ declare namespace svelteHTML {
'on:oisyCkBtcUpdateBalance'?: (event: CustomEvent<any>) => void;
'on:oisyCkBtcMinterInfoStatus'?: (event: CustomEvent<any>) => void;
'on:oisyCkEthMinterInfoStatus'?: (event: CustomEvent<any>) => void;
'on:oisyCkEthPendingTransactions'?: (event: CustomEvent<any>) => void;
'on:oisyCkEthereumPendingTransactions'?: (event: CustomEvent<any>) => void;
}
}

Expand Down
58 changes: 57 additions & 1 deletion src/frontend/src/env/networks.ircrc.env.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { CKBTC_EXPLORER_URL, CKETH_EXPLORER_URL } from '$env/explorers.env';
import { BTC_MAINNET_TOKEN, BTC_TESTNET_TOKEN } from '$env/tokens.btc.env';
import { ETHEREUM_TOKEN, SEPOLIA_TOKEN } from '$env/tokens.env';
import { SEPOLIA_USDC_TOKEN } from '$env/tokens.erc20.env';
import type { IcCkInterface } from '$icp/types/ic';
import { LOCAL, PROD, STAGING } from '$lib/constants/app.constants';
import type { CanisterIdText } from '$lib/types/canister';
Expand Down Expand Up @@ -172,6 +173,59 @@ export const CKETH_LEDGER_CANISTER_IDS: [CanisterIdText, ...CanisterIdText[]] =
...CKETH_LEDGER_CANISTER_TESTNET_IDS
];

/**
* ckERC20
*/

export const STAGING_CKUSDC_LEDGER_CANISTER_ID = import.meta.env
.VITE_STAGING_CKUSDC_LEDGER_CANISTER_ID as CanisterIdText | null | undefined;
export const STAGING_CKUSDC_INDEX_CANISTER_ID = import.meta.env
.VITE_STAGING_CKUSDC_INDEX_CANISTER_ID as CanisterIdText | null | undefined;

export const LOCAL_CKUSDC_LEDGER_CANISTER_ID = import.meta.env
.VITE_LOCAL_CKUSDC_LEDGER_CANISTER_ID as CanisterIdText | null | undefined;
export const LOCAL_CKUSDC_INDEX_CANISTER_ID = import.meta.env
.VITE_LOCAL_CKUSDC_INDEX_CANISTER_ID as CanisterIdText | null | undefined;

const CKUSDC_LOCAL_DATA: IcCkInterface | undefined =
LOCAL &&
nonNullish(LOCAL_CKUSDC_LEDGER_CANISTER_ID) &&
nonNullish(LOCAL_CKUSDC_INDEX_CANISTER_ID) &&
nonNullish(LOCAL_CKETH_MINTER_CANISTER_ID)
? {
ledgerCanisterId: LOCAL_CKUSDC_LEDGER_CANISTER_ID,
indexCanisterId: LOCAL_CKUSDC_INDEX_CANISTER_ID,
minterCanisterId: LOCAL_CKETH_MINTER_CANISTER_ID,
exchangeCoinId: 'ethereum',
position: 4,
twinToken: SEPOLIA_USDC_TOKEN
}
: undefined;

const CKUSDC_STAGING_DATA: IcCkInterface | undefined =
(STAGING || PROD) &&
nonNullish(STAGING_CKUSDC_LEDGER_CANISTER_ID) &&
nonNullish(STAGING_CKUSDC_INDEX_CANISTER_ID) &&
nonNullish(STAGING_CKETH_MINTER_CANISTER_ID)
? {
ledgerCanisterId: STAGING_CKUSDC_LEDGER_CANISTER_ID,
indexCanisterId: STAGING_CKUSDC_INDEX_CANISTER_ID,
minterCanisterId: STAGING_CKETH_MINTER_CANISTER_ID,
exchangeCoinId: 'ethereum',
position: 3,
twinToken: SEPOLIA_USDC_TOKEN
}
: undefined;

export const CKUSDC_LEDGER_CANISTER_TESTNET_IDS: CanisterIdText[] = [
...(nonNullish(STAGING_CKUSDC_LEDGER_CANISTER_ID) ? [STAGING_CKUSDC_LEDGER_CANISTER_ID] : []),
...(nonNullish(LOCAL_CKUSDC_LEDGER_CANISTER_ID) ? [LOCAL_CKUSDC_LEDGER_CANISTER_ID] : [])
];

export const CKERC20_LEDGER_CANISTER_IDS: CanisterIdText[] = [
...CKUSDC_LEDGER_CANISTER_TESTNET_IDS
];

/**
* All ICRC tokens data
*/
Expand All @@ -182,5 +236,7 @@ export const ICRC_TOKENS: IcCkInterface[] = [
...(nonNullish(CKBTC_IC_DATA) ? [CKBTC_IC_DATA] : []),
...(nonNullish(CKETH_LOCAL_DATA) ? [CKETH_LOCAL_DATA] : []),
...(nonNullish(CKETH_STAGING_DATA) ? [CKETH_STAGING_DATA] : []),
...(nonNullish(CKETH_IC_DATA) ? [CKETH_IC_DATA] : [])
...(nonNullish(CKETH_IC_DATA) ? [CKETH_IC_DATA] : []),
...(nonNullish(CKUSDC_LOCAL_DATA) ? [CKUSDC_LOCAL_DATA] : []),
...(nonNullish(CKUSDC_STAGING_DATA) ? [CKUSDC_STAGING_DATA] : [])
];
86 changes: 70 additions & 16 deletions src/frontend/src/env/tokens.erc20.env.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import { ETHEREUM_NETWORK, SEPOLIA_NETWORK } from '$env/networks.env';
import { ETH_MAINNET_ENABLED } from '$env/networks.eth.env';
import type { Erc20Contract } from '$eth/types/erc20';
import type { Erc20Contract, RequiredErc20Token } from '$eth/types/erc20';
import type { EthereumNetwork } from '$eth/types/network';
import usdc from '$icp-eth/assets/usdc.svg';
import type { TokenId } from '$lib/types/token';

const ERC20_CONTRACT_ADDRESS_UNISWAP: Erc20Contract = {
// Uniswap
Expand All @@ -18,12 +20,14 @@ const ERC20_CONTRACTS_SEPOLIA: Erc20Contract[] = [
ERC20_CONTRACT_ADDRESS_UNISWAP
];

export const ERC20_CONTRACT_ICP_GOERLI: Erc20Contract = {
// ICP
address: '0x8c283B98Edeb405816FD1D321005dF4d3AA956ba',
exchange: 'icp'
};

const _ERC20_CONTRACTS_GOERLI: Erc20Contract[] = [
{
// ICP
address: '0x8c283B98Edeb405816FD1D321005dF4d3AA956ba',
exchange: 'icp'
},
ERC20_CONTRACT_ICP_GOERLI,
{
// Weenus
address: '0xaFF4481D10270F50f203E0763e2597776068CBc5',
Expand All @@ -32,17 +36,14 @@ const _ERC20_CONTRACTS_GOERLI: Erc20Contract[] = [
ERC20_CONTRACT_ADDRESS_UNISWAP
];

export const ERC20_CONTRACT_ICP: Erc20Contract = {
// ICP
address: '0x054B8f99D15cC5B35a42a926635977d62692F25b',
exchange: 'icp'
};

const ERC20_CONTRACTS_PRODUCTION: Erc20Contract[] = [
{
// ICP
address: '0x054B8f99D15cC5B35a42a926635977d62692F25b',
exchange: 'icp'
},
{
// USDC
address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
exchange: 'ethereum'
},
ERC20_CONTRACT_ICP,
{
// USDT
address: '0xdAC17F958D2ee523a2206206994597C13D831ec7',
Expand All @@ -67,3 +68,56 @@ export const ERC20_CONTRACTS: (Erc20Contract & { network: EthereumNetwork })[] =
: []),
...ERC20_CONTRACTS_SEPOLIA.map((contract) => ({ ...contract, network: SEPOLIA_NETWORK }))
];

/**
* ERC20 which have twin tokens counterparts.
* Because we manage those with ckERC20, we describe their details statically for simplicity reason.
* Unlike other Erc20 tokens, for which we load the details at runtime based one their contract address.
*/

export const USDC_DECIMALS = 6;

export const USDC_SYMBOL = 'USDC';

export const USDC_TOKEN_ID: unique symbol = Symbol(USDC_SYMBOL);

export const USDC_TOKEN: RequiredErc20Token = {
id: USDC_TOKEN_ID,
network: ETHEREUM_NETWORK,
standard: 'erc20',
category: 'default',
name: 'USD Coin',
symbol: 'USDC',
decimals: USDC_DECIMALS,
icon: usdc,
address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
exchange: 'erc20',
twinTokenSymbol: 'ckUSDC'
};

export const SEPOLIA_USDC_SYMBOL = 'SepoliaUSDC';

export const SEPOLIA_USDC_TOKEN_ID: unique symbol = Symbol(SEPOLIA_USDC_SYMBOL);

export const SEPOLIA_USDC_TOKEN: RequiredErc20Token = {
id: SEPOLIA_USDC_TOKEN_ID,
network: SEPOLIA_NETWORK,
standard: 'erc20',
category: 'default',
name: 'USDC',
symbol: 'USDC',
decimals: USDC_DECIMALS,
icon: usdc,
address: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238',
exchange: 'erc20',
twinTokenSymbol: 'ckSepoliaUSDC'
};

const ERC20_TWIN_TOKENS_SEPOLIA: RequiredErc20Token[] = [SEPOLIA_USDC_TOKEN];

export const ERC20_TWIN_TOKENS: RequiredErc20Token[] = [
...(ETH_MAINNET_ENABLED ? [USDC_TOKEN] : []),
...ERC20_TWIN_TOKENS_SEPOLIA
];

export const ERC20_TWIN_TOKENS_IDS: TokenId[] = ERC20_TWIN_TOKENS.map(({ id }) => id);
Loading

0 comments on commit 5b203e9

Please sign in to comment.