From 03a525eeddbd1050b55e1f70c408283e08e5040a Mon Sep 17 00:00:00 2001 From: Michael Buntarman Date: Wed, 1 Oct 2025 16:06:12 +0700 Subject: [PATCH 01/11] chore: release ami build during version release (#1187) --- .github/workflows/ami-build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ami-build.yml b/.github/workflows/ami-build.yml index f5352369f..b3b64e20b 100644 --- a/.github/workflows/ami-build.yml +++ b/.github/workflows/ami-build.yml @@ -84,6 +84,7 @@ jobs: echo "Deploying AMI pipeline infrastructure for stage: ${{ env.STAGE }}..." cdk bootstrap --require-approval never cdk deploy AMI-Pipeline-${{ env.STAGE }}-Stack \ + --app "go run ami-cdk.go" \ --context stage=${{ env.STAGE }} \ --require-approval never From deca98f5699ea6258c7e9dba4a61b8e88aa89aa0 Mon Sep 17 00:00:00 2001 From: williamrusdyputra Date: Wed, 1 Oct 2025 16:40:18 +0700 Subject: [PATCH 02/11] chore: change escrow address --- internal/migrations/erc20-bridge/000-extension.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/migrations/erc20-bridge/000-extension.sql b/internal/migrations/erc20-bridge/000-extension.sql index b70d50627..cf01a2bfa 100644 --- a/internal/migrations/erc20-bridge/000-extension.sql +++ b/internal/migrations/erc20-bridge/000-extension.sql @@ -2,5 +2,5 @@ USE erc20 { chain: 'sepolia', - escrow: '0x2D4f435867066737bA1617ef024E073413909Ad2' + escrow: '0x502430eD0BbE0f230215870c9C2853e126eE5Ae3' } AS sepolia_bridge; \ No newline at end of file From b8c8f98f774ed009b334e3b9cbc91f1c7dbfde92 Mon Sep 17 00:00:00 2001 From: williamrusdyputra Date: Thu, 23 Oct 2025 10:51:10 +0700 Subject: [PATCH 03/11] chore: update erc20 extension queries --- .../migrations/erc20-bridge/000-extension.sql | 14 ++++++++--- .../migrations/erc20-bridge/001-actions.sql | 25 ++++++++++++++++--- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/internal/migrations/erc20-bridge/000-extension.sql b/internal/migrations/erc20-bridge/000-extension.sql index 9d2d06b00..849996906 100644 --- a/internal/migrations/erc20-bridge/000-extension.sql +++ b/internal/migrations/erc20-bridge/000-extension.sql @@ -1,6 +1,14 @@ -- This is not meant to be run on tests as the contract address is valid for mainnet only. +-- Note: Uncomment if you want to run on testnet for sepolia. +-- USE erc20 { +-- chain: 'sepolia', +-- escrow: '0xf6009345d772a04f4e52150b5ec91617db79be58', +-- distribution_period: '30m' +-- } AS sepolia_bridge; + USE erc20 { - chain: 'sepolia', - escrow: '0x502430eD0BbE0f230215870c9C2853e126eE5Ae3' -} AS sepolia_bridge; \ No newline at end of file + chain: 'ethereum', + escrow: '0x964dd66477c22BC5726dfeBCf9BA49aa8625978C', + distribution_period: '30m' +} AS ethereum_bridge; \ No newline at end of file diff --git a/internal/migrations/erc20-bridge/001-actions.sql b/internal/migrations/erc20-bridge/001-actions.sql index 3713f7f60..8c3ac53df 100644 --- a/internal/migrations/erc20-bridge/001-actions.sql +++ b/internal/migrations/erc20-bridge/001-actions.sql @@ -1,4 +1,5 @@ -CREATE OR REPLACE ACTION get_erc20_bridge_info() +-- TESTNET +CREATE OR REPLACE ACTION sepolia_get_erc20_bridge_info() PUBLIC VIEW RETURNS ( chain TEXT, escrow TEXT, @@ -15,7 +16,6 @@ PUBLIC VIEW RETURNS ( } }; --- 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; @@ -26,11 +26,28 @@ CREATE OR REPLACE ACTION sepolia_bridge_tokens($recipient TEXT DEFAULT NULL, $am }; -- MAINNET +CREATE OR REPLACE ACTION ethereum_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 ethereum_bridge.info() { + RETURN $row.chain, $row.escrow, $row.epoch_period, $row.erc20, $row.decimals, $row.balance, $row.synced, $row.synced_at, $row.enabled; + } +}; + CREATE OR REPLACE ACTION ethereum_wallet_balance($wallet_address TEXT) PUBLIC VIEW RETURNS (balance NUMERIC(78, 0)) { - $balance := mainnet_bridge.balance($wallet_address); + $balance := ethereum_bridge.balance($wallet_address); RETURN $balance; }; CREATE OR REPLACE ACTION ethereum_bridge_tokens($recipient TEXT DEFAULT NULL, $amount TEXT) PUBLIC { - mainnet_bridge.bridge(COALESCE($recipient, @caller), $amount::NUMERIC(78, 0)); + ethereum_bridge.bridge(COALESCE($recipient, @caller), $amount::NUMERIC(78, 0)); }; From 6c1abfd8e1889c571051f6e22b7c8b46570dc895 Mon Sep 17 00:00:00 2001 From: williamrusdyputra Date: Thu, 23 Oct 2025 11:20:15 +0700 Subject: [PATCH 04/11] chore: update erc20 test --- tests/extensions/erc20/erc20_bridge_transfer_actions_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/extensions/erc20/erc20_bridge_transfer_actions_test.go b/tests/extensions/erc20/erc20_bridge_transfer_actions_test.go index 39d9b4ca5..8c5e85db3 100644 --- a/tests/extensions/erc20/erc20_bridge_transfer_actions_test.go +++ b/tests/extensions/erc20/erc20_bridge_transfer_actions_test.go @@ -248,7 +248,7 @@ func getBridgeEscrowAddress(ctx context.Context, platform *kwilTesting.Platform) engineCtx := engCtx(ctx, platform, "0x0000000000000000000000000000000000000000", 1, false) var escrow string - res, err := platform.Engine.Call(engineCtx, platform.DB, "", "get_erc20_bridge_info", []any{}, func(row *common.Row) error { + res, err := platform.Engine.Call(engineCtx, platform.DB, "", "sepolia_get_erc20_bridge_info", []any{}, func(row *common.Row) error { if len(row.Values) < 2 { return fmt.Errorf("expected at least 2 columns, got %d", len(row.Values)) } From a0bbb71421f6f4c84a52da9edec4e49a3de0c9a0 Mon Sep 17 00:00:00 2001 From: williamrusdyputra Date: Thu, 23 Oct 2025 11:31:52 +0700 Subject: [PATCH 05/11] chore: uncomment sepolia bridge --- internal/migrations/erc20-bridge/000-extension.sql | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/internal/migrations/erc20-bridge/000-extension.sql b/internal/migrations/erc20-bridge/000-extension.sql index 849996906..9e4be74cc 100644 --- a/internal/migrations/erc20-bridge/000-extension.sql +++ b/internal/migrations/erc20-bridge/000-extension.sql @@ -1,11 +1,10 @@ -- This is not meant to be run on tests as the contract address is valid for mainnet only. --- Note: Uncomment if you want to run on testnet for sepolia. --- USE erc20 { --- chain: 'sepolia', --- escrow: '0xf6009345d772a04f4e52150b5ec91617db79be58', --- distribution_period: '30m' --- } AS sepolia_bridge; +USE erc20 { + chain: 'sepolia', + escrow: '0xf6009345d772a04f4e52150b5ec91617db79be58', + distribution_period: '30m' +} AS sepolia_bridge; USE erc20 { chain: 'ethereum', From 89689d6e1b06e36c510fc0c1124606122c89a659 Mon Sep 17 00:00:00 2001 From: williamrusdyputra Date: Thu, 23 Oct 2025 12:03:21 +0700 Subject: [PATCH 06/11] fix: enabled instance --- .../extensions/erc20/erc20_bridge_transfer_actions_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/extensions/erc20/erc20_bridge_transfer_actions_test.go b/tests/extensions/erc20/erc20_bridge_transfer_actions_test.go index 8c5e85db3..117610b2c 100644 --- a/tests/extensions/erc20/erc20_bridge_transfer_actions_test.go +++ b/tests/extensions/erc20/erc20_bridge_transfer_actions_test.go @@ -21,9 +21,9 @@ import ( // without needing to use the extension methods directly. func TestSepoliaTransferActions(t *testing.T) { seedAndRun(t, "sepolia_transfer_actions", func(ctx context.Context, platform *kwilTesting.Platform) error { - // Enable instance with alias in one step - err := erc20shim.ForTestingSeedAndActivateInstance(ctx, platform, TestChain, TestEscrowA, TestERC20, 18, 60, TestExtensionAlias) - require.NoError(t, err) + // Enable instance with alias in one step (Instance already enabled from another test) + // err := erc20shim.ForTestingSeedAndActivateInstance(ctx, platform, TestChain, TestEscrowA, TestERC20, 18, 60, TestExtensionAlias) + // require.NoError(t, err) // Get the configured escrow address from bridge info configuredEscrow, err := getBridgeEscrowAddress(ctx, platform) From 02f5434776ec2475f30b4ef2e5b431b0154e47a0 Mon Sep 17 00:00:00 2001 From: williamrusdyputra Date: Thu, 23 Oct 2025 12:13:46 +0700 Subject: [PATCH 07/11] fix: log if instance already exist --- .../extensions/erc20/erc20_bridge_transfer_actions_test.go | 6 +++--- tests/streams/utils/erc20/inject.go | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/extensions/erc20/erc20_bridge_transfer_actions_test.go b/tests/extensions/erc20/erc20_bridge_transfer_actions_test.go index 117610b2c..8c5e85db3 100644 --- a/tests/extensions/erc20/erc20_bridge_transfer_actions_test.go +++ b/tests/extensions/erc20/erc20_bridge_transfer_actions_test.go @@ -21,9 +21,9 @@ import ( // without needing to use the extension methods directly. func TestSepoliaTransferActions(t *testing.T) { seedAndRun(t, "sepolia_transfer_actions", func(ctx context.Context, platform *kwilTesting.Platform) error { - // Enable instance with alias in one step (Instance already enabled from another test) - // err := erc20shim.ForTestingSeedAndActivateInstance(ctx, platform, TestChain, TestEscrowA, TestERC20, 18, 60, TestExtensionAlias) - // require.NoError(t, err) + // Enable instance with alias in one step + err := erc20shim.ForTestingSeedAndActivateInstance(ctx, platform, TestChain, TestEscrowA, TestERC20, 18, 60, TestExtensionAlias) + require.NoError(t, err) // Get the configured escrow address from bridge info configuredEscrow, err := getBridgeEscrowAddress(ctx, platform) diff --git a/tests/streams/utils/erc20/inject.go b/tests/streams/utils/erc20/inject.go index 356969b9e..e24bf8438 100644 --- a/tests/streams/utils/erc20/inject.go +++ b/tests/streams/utils/erc20/inject.go @@ -7,6 +7,7 @@ import ( "context" "encoding/binary" "fmt" + "log" "math/big" ethcommon "github.com/ethereum/go-ethereum/common" @@ -25,7 +26,7 @@ func InjectERC20Transfer(ctx context.Context, platform *kwilTesting.Platform, ch // 1) Ensure instance exists and is synced id, err := erc20bridge.ForTestingForceSyncInstance(ctx, platform, chain, escrow, erc20Addr, 18) if err != nil { - return fmt.Errorf("force sync instance: %w", err) + log.Printf("force sync instance: %w", err) // instance already exists } // 2) Compute ordered-sync topic From 236e78c1e9573f08aeb2aeaac55281e8c0c8a569 Mon Sep 17 00:00:00 2001 From: williamrusdyputra Date: Thu, 23 Oct 2025 12:15:04 +0700 Subject: [PATCH 08/11] chore: update public transfer action --- .../migrations/erc20-bridge/002-public-transfer-actions.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/migrations/erc20-bridge/002-public-transfer-actions.sql b/internal/migrations/erc20-bridge/002-public-transfer-actions.sql index 5a993097a..3c6d0de6a 100644 --- a/internal/migrations/erc20-bridge/002-public-transfer-actions.sql +++ b/internal/migrations/erc20-bridge/002-public-transfer-actions.sql @@ -19,7 +19,7 @@ CREATE OR REPLACE ACTION sepolia_transfer($to_address TEXT, $amount TEXT) PUBLIC -- MAINNET TRANSFERS -CREATE OR REPLACE ACTION mainnet_transfer($to_address TEXT, $amount TEXT) PUBLIC { +CREATE OR REPLACE ACTION ethereum_transfer($to_address TEXT, $amount TEXT) PUBLIC { -- Validate Ethereum address format if NOT check_ethereum_address($to_address) { ERROR('Invalid Ethereum address format. Must be a valid Ethereum address: ' || $to_address); @@ -31,6 +31,6 @@ CREATE OR REPLACE ACTION mainnet_transfer($to_address TEXT, $amount TEXT) PUBLIC } -- Execute transfer using the bridge extension - mainnet_bridge.transfer($to_address, $amount::NUMERIC(78, 0)); + ethereum_bridge.transfer($to_address, $amount::NUMERIC(78, 0)); }; From ff2ebbb5d5906555386914d50976ca7a43bbd109 Mon Sep 17 00:00:00 2001 From: williamrusdyputra Date: Thu, 23 Oct 2025 12:20:09 +0700 Subject: [PATCH 09/11] fix: directive --- tests/streams/utils/erc20/inject.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/streams/utils/erc20/inject.go b/tests/streams/utils/erc20/inject.go index e24bf8438..09f561bc5 100644 --- a/tests/streams/utils/erc20/inject.go +++ b/tests/streams/utils/erc20/inject.go @@ -26,7 +26,7 @@ func InjectERC20Transfer(ctx context.Context, platform *kwilTesting.Platform, ch // 1) Ensure instance exists and is synced id, err := erc20bridge.ForTestingForceSyncInstance(ctx, platform, chain, escrow, erc20Addr, 18) if err != nil { - log.Printf("force sync instance: %w", err) // instance already exists + log.Printf("force sync instance: %v", err) // instance already exists } // 2) Compute ordered-sync topic From d86bcf66500af21d97983a6522d4a16b791b55be Mon Sep 17 00:00:00 2001 From: williamrusdyputra Date: Thu, 23 Oct 2025 12:37:07 +0700 Subject: [PATCH 10/11] chore: revert to previous state --- internal/migrations/erc20-bridge/000-extension.sql | 11 ++++++----- tests/streams/utils/erc20/inject.go | 3 +-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/internal/migrations/erc20-bridge/000-extension.sql b/internal/migrations/erc20-bridge/000-extension.sql index 9e4be74cc..21c6b0003 100644 --- a/internal/migrations/erc20-bridge/000-extension.sql +++ b/internal/migrations/erc20-bridge/000-extension.sql @@ -6,8 +6,9 @@ USE erc20 { distribution_period: '30m' } AS sepolia_bridge; -USE erc20 { - chain: 'ethereum', - escrow: '0x964dd66477c22BC5726dfeBCf9BA49aa8625978C', - distribution_period: '30m' -} AS ethereum_bridge; \ No newline at end of file +-- Note: uncomment the following to enable mainnet bridge instance +-- USE erc20 { +-- chain: 'ethereum', +-- escrow: '0x964dd66477c22BC5726dfeBCf9BA49aa8625978C', +-- distribution_period: '30m' +-- } AS ethereum_bridge; \ No newline at end of file diff --git a/tests/streams/utils/erc20/inject.go b/tests/streams/utils/erc20/inject.go index 09f561bc5..356969b9e 100644 --- a/tests/streams/utils/erc20/inject.go +++ b/tests/streams/utils/erc20/inject.go @@ -7,7 +7,6 @@ import ( "context" "encoding/binary" "fmt" - "log" "math/big" ethcommon "github.com/ethereum/go-ethereum/common" @@ -26,7 +25,7 @@ func InjectERC20Transfer(ctx context.Context, platform *kwilTesting.Platform, ch // 1) Ensure instance exists and is synced id, err := erc20bridge.ForTestingForceSyncInstance(ctx, platform, chain, escrow, erc20Addr, 18) if err != nil { - log.Printf("force sync instance: %v", err) // instance already exists + return fmt.Errorf("force sync instance: %w", err) } // 2) Compute ordered-sync topic From 6aec304a9f876c307fcc4b471c50c1788e4adcdd Mon Sep 17 00:00:00 2001 From: williamrusdyputra Date: Thu, 23 Oct 2025 13:34:52 +0700 Subject: [PATCH 11/11] fix: migration --- .../migrations/erc20-bridge/000-extension.sql | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/internal/migrations/erc20-bridge/000-extension.sql b/internal/migrations/erc20-bridge/000-extension.sql index 21c6b0003..f258d153b 100644 --- a/internal/migrations/erc20-bridge/000-extension.sql +++ b/internal/migrations/erc20-bridge/000-extension.sql @@ -1,14 +1,19 @@ -- This is not meant to be run on tests as the contract address is valid for mainnet only. +-- USE erc20 { +-- chain: 'sepolia', +-- escrow: '0xf6009345d772a04f4e52150b5ec91617db79be58', +-- distribution_period: '30m' +-- } AS sepolia_bridge; -USE erc20 { - chain: 'sepolia', - escrow: '0xf6009345d772a04f4e52150b5ec91617db79be58', - distribution_period: '30m' -} AS sepolia_bridge; - --- Note: uncomment the following to enable mainnet bridge instance -- USE erc20 { -- chain: 'ethereum', -- escrow: '0x964dd66477c22BC5726dfeBCf9BA49aa8625978C', -- distribution_period: '30m' --- } AS ethereum_bridge; \ No newline at end of file +-- } AS ethereum_bridge; + +-- TESTING ONLY --- +-- The following is for test environments where the sepolia bridge is used. Please comment for production and use the above. +USE erc20 { + chain: 'sepolia', + escrow: '0x502430eD0BbE0f230215870c9C2853e126eE5Ae3' +} AS sepolia_bridge; \ No newline at end of file