From e23411de2537d98f79aaac019ea58f1fccec0551 Mon Sep 17 00:00:00 2001 From: williamrusdyputra Date: Mon, 15 Sep 2025 10:34:23 +0700 Subject: [PATCH 1/2] feat: apply fee when withdrawing TRUF tokens --- .../migrations/erc20-bridge/001-actions.sql | 161 ++---------------- 1 file changed, 14 insertions(+), 147 deletions(-) diff --git a/internal/migrations/erc20-bridge/001-actions.sql b/internal/migrations/erc20-bridge/001-actions.sql index f63d5e017..18020791c 100644 --- a/internal/migrations/erc20-bridge/001-actions.sql +++ b/internal/migrations/erc20-bridge/001-actions.sql @@ -1,164 +1,31 @@ -/** - Bridge Mechanism: - 1. Call [chain]_admin_lock_tokens(), to lock x amount of tokens from user. - 2. Call [chain]_admin_issue_tokens(), to issue the locked tokens to layer-1 (escrow on ethereum). - 3. Frontend will call `list_wallet_rewards --namespace [chain]_bridge` to get inclusion proofs. - 4. Frontend will call claimReward function on escrow contract using the inclusion proofs given. - 5. Receiver wallet will get the tokens after claim is done. -*/ - -- TESTNET CREATE OR REPLACE ACTION sepolia_wallet_balance($wallet_address TEXT) PUBLIC VIEW RETURNS (balance NUMERIC(78, 0)) { - $lower_caller TEXT := LOWER(@caller); - - -- Permission Check: Ensure caller has the 'system:erc20_bridge_writer' role. - $has_permission BOOL := false; - for $row in are_members_of('system', 'erc20_bridge_writer', ARRAY[$lower_caller]) { - if $row.wallet = $lower_caller AND $row.is_member { - $has_permission := true; - break; - } - } - if NOT $has_permission { - ERROR('Caller does not have the required system:erc20_bridge_writer role to read balance.'); - } - $balance := sepolia_bridge.balance($wallet_address); return $balance; }; -CREATE OR REPLACE ACTION sepolia_admin_lock_tokens($wallet_address TEXT, $amount TEXT) PUBLIC { - $lower_caller TEXT := LOWER(@caller); - - -- Permission Check: Ensure caller has the 'system:erc20_bridge_writer' role. - $has_permission BOOL := false; - for $row in are_members_of('system', 'erc20_bridge_writer', ARRAY[$lower_caller]) { - if $row.wallet = $lower_caller AND $row.is_member { - $has_permission := true; - break; - } - } - if NOT $has_permission { - ERROR('Caller does not have the required system:erc20_bridge_writer role to lock tokens.'); - } - - sepolia_bridge.lock_admin($wallet_address, $amount::NUMERIC(78, 0)); -}; - -CREATE OR REPLACE ACTION sepolia_admin_unlock_tokens($to_address TEXT, $amount TEXT) PUBLIC { - $lower_caller TEXT := LOWER(@caller); - - -- Permission Check: Ensure caller has the 'system:erc20_bridge_writer' role. - $has_permission BOOL := false; - for $row in are_members_of('system', 'erc20_bridge_writer', ARRAY[$lower_caller]) { - if $row.wallet = $lower_caller AND $row.is_member { - $has_permission := true; - break; - } - } - if NOT $has_permission { - ERROR('Caller does not have the required system:erc20_bridge_writer role to unlock tokens.'); - } - - sepolia_bridge.unlock($to_address, $amount::NUMERIC(78, 0)); -}; - -CREATE OR REPLACE ACTION sepolia_admin_issue_tokens($to_address TEXT, $amount TEXT) PUBLIC { - $lower_caller TEXT := LOWER(@caller); - - -- Permission Check: Ensure caller has the 'system:erc20_bridge_writer' role. - $has_permission BOOL := false; - for $row in are_members_of('system', 'erc20_bridge_writer', ARRAY[$lower_caller]) { - if $row.wallet = $lower_caller AND $row.is_member { - $has_permission := true; - break; - } - } - if NOT $has_permission { - ERROR('Caller does not have the required system:erc20_bridge_writer role to issue tokens.'); - } - - sepolia_bridge.issue($to_address, $amount::NUMERIC(78, 0)); -}; - CREATE OR REPLACE ACTION sepolia_admin_bridge_tokens($amount TEXT) PUBLIC { - sepolia_bridge.bridge($amount::NUMERIC(78, 0)); + -- Calculate 1% fee and lock it in our treasury + $numAmount := $amount::NUMERIC(78, 0); + $fee := $numAmount * 0.01; + sepolia_bridge.lock($fee); + + -- Bridge the rest to users + sepolia_bridge.bridge($numAmount - $fee); }; -- MAINNET CREATE OR REPLACE ACTION mainnet_wallet_balance($wallet_address TEXT) PUBLIC VIEW RETURNS (balance NUMERIC(78, 0)) { - $lower_caller TEXT := LOWER(@caller); - - -- Permission Check: Ensure caller has the 'system:erc20_bridge_writer' role. - $has_permission BOOL := false; - for $row in are_members_of('system', 'erc20_bridge_writer', ARRAY[$lower_caller]) { - if $row.wallet = $lower_caller AND $row.is_member { - $has_permission := true; - break; - } - } - if NOT $has_permission { - ERROR('Caller does not have the required system:erc20_bridge_writer role to read balance.'); - } - $balance := mainnet_bridge.balance($wallet_address); return $balance; }; -CREATE OR REPLACE ACTION mainnet_admin_lock_tokens($wallet_address TEXT, $amount TEXT) PUBLIC { - $lower_caller TEXT := LOWER(@caller); - - -- Permission Check: Ensure caller has the 'system:erc20_bridge_writer' role. - $has_permission BOOL := false; - for $row in are_members_of('system', 'erc20_bridge_writer', ARRAY[$lower_caller]) { - if $row.wallet = $lower_caller AND $row.is_member { - $has_permission := true; - break; - } - } - if NOT $has_permission { - ERROR('Caller does not have the required system:erc20_bridge_writer role to lock tokens.'); - } - - mainnet_bridge.lock_admin($wallet_address, $amount::NUMERIC(78, 0)); -}; - -CREATE OR REPLACE ACTION mainnet_admin_unlock_tokens($to_address TEXT, $amount TEXT) PUBLIC { - $lower_caller TEXT := LOWER(@caller); - - -- Permission Check: Ensure caller has the 'system:erc20_bridge_writer' role. - $has_permission BOOL := false; - for $row in are_members_of('system', 'erc20_bridge_writer', ARRAY[$lower_caller]) { - if $row.wallet = $lower_caller AND $row.is_member { - $has_permission := true; - break; - } - } - if NOT $has_permission { - ERROR('Caller does not have the required system:erc20_bridge_writer role to unlock tokens.'); - } - - mainnet_bridge.unlock($to_address, $amount::NUMERIC(78, 0)); -}; - -CREATE OR REPLACE ACTION mainnet_admin_issue_tokens($to_address TEXT, $amount TEXT) PUBLIC { - $lower_caller TEXT := LOWER(@caller); - - -- Permission Check: Ensure caller has the 'system:erc20_bridge_writer' role. - $has_permission BOOL := false; - for $row in are_members_of('system', 'erc20_bridge_writer', ARRAY[$lower_caller]) { - if $row.wallet = $lower_caller AND $row.is_member { - $has_permission := true; - break; - } - } - if NOT $has_permission { - ERROR('Caller does not have the required system:erc20_bridge_writer role to issue tokens.'); - } - - mainnet_bridge.issue($to_address, $amount::NUMERIC(78, 0)); -}; - CREATE OR REPLACE ACTION mainnet_admin_bridge_tokens($amount TEXT) PUBLIC { - mainnet_bridge.bridge($amount::NUMERIC(78, 0)); + -- Calculate 1% fee and lock it in our treasury + $numAmount := $amount::NUMERIC(78, 0); + $fee := $numAmount * 0.01; + mainnet_bridge.lock($fee); + + -- Bridge the rest to users + mainnet_bridge.bridge($numAmount - $fee); }; \ No newline at end of file From 4ee7d51f293bed1e9992e8fe2a35a7414e3862be Mon Sep 17 00:00:00 2001 From: williamrusdyputra Date: Mon, 15 Sep 2025 11:29:29 +0700 Subject: [PATCH 2/2] feat: add erc20 bridge info action --- .../migrations/erc20-bridge/001-actions.sql | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/internal/migrations/erc20-bridge/001-actions.sql b/internal/migrations/erc20-bridge/001-actions.sql index 18020791c..6e46899c1 100644 --- a/internal/migrations/erc20-bridge/001-actions.sql +++ b/internal/migrations/erc20-bridge/001-actions.sql @@ -1,7 +1,24 @@ +CREATE OR REPLACE ACTION get_erc20_bridge_info() +PUBLIC VIEW RETURNS ( + chain TEXT, + escrow TEXT, + epoch_period TEXT, + erc20 TEXT, + decimals INT, + balance NUMERIC(78, 0), + synced BOOLEAN, + synced_at INT8, + enabled BOOLEAN +) { + FOR $row IN sepolia_bridge.info() { + RETURN $row.chain, $row.escrow, $row.epoch_period, $row.erc20, $row.decimals, $row.balance, $row.synced, $row.synced_at, $row.enabled; + } +}; + -- TESTNET CREATE OR REPLACE ACTION sepolia_wallet_balance($wallet_address TEXT) PUBLIC VIEW RETURNS (balance NUMERIC(78, 0)) { $balance := sepolia_bridge.balance($wallet_address); - return $balance; + RETURN $balance; }; CREATE OR REPLACE ACTION sepolia_admin_bridge_tokens($amount TEXT) PUBLIC { @@ -17,7 +34,7 @@ CREATE OR REPLACE ACTION sepolia_admin_bridge_tokens($amount TEXT) PUBLIC { -- MAINNET CREATE OR REPLACE ACTION mainnet_wallet_balance($wallet_address TEXT) PUBLIC VIEW RETURNS (balance NUMERIC(78, 0)) { $balance := mainnet_bridge.balance($wallet_address); - return $balance; + RETURN $balance; }; CREATE OR REPLACE ACTION mainnet_admin_bridge_tokens($amount TEXT) PUBLIC {