From a8c592094d58c9ec0130afae09f2aee6883b3e1d Mon Sep 17 00:00:00 2001 From: FelixFan1992 Date: Wed, 3 Dec 2025 12:42:49 -0500 Subject: [PATCH 01/12] firedrill test contracts by felix --- chains/sui/contracts/ccip/.gitignore | 4 + chains/sui/contracts/ccip/Move.lock | 56 +++++ chains/sui/contracts/ccip/Move.toml | 33 +++ .../contracts/ccip/sources/fee_quoter.move | 31 +++ .../sui/contracts/ccip/tests/ccip_tests.move | 18 ++ chains/sui/contracts/ccip_offramp/.gitignore | 4 + chains/sui/contracts/ccip_offramp/Move.lock | 68 ++++++ chains/sui/contracts/ccip_offramp/Move.toml | 14 ++ .../ccip_offramp/sources/ocr3_base.move | 21 ++ .../ccip_offramp/sources/offramp.move | 205 ++++++++++++++++++ .../tests/ccip_offramp_tests.move | 18 ++ chains/sui/contracts/ccip_onramp/.gitignore | 4 + chains/sui/contracts/ccip_onramp/Move.lock | 68 ++++++ chains/sui/contracts/ccip_onramp/Move.toml | 14 ++ .../ccip_onramp/sources/ccip_onramp.move | 110 ++++++++++ .../ccip_onramp/tests/ccip_onramp_tests.move | 18 ++ chains/sui/contracts/firedrill/.gitignore | 4 + chains/sui/contracts/firedrill/Move.lock | 94 ++++++++ chains/sui/contracts/firedrill/Move.toml | 20 ++ .../firedrill/sources/firedrill.move | 122 +++++++++++ .../firedrill/tests/firedrill_tests.move | 18 ++ 21 files changed, 944 insertions(+) create mode 100644 chains/sui/contracts/ccip/.gitignore create mode 100644 chains/sui/contracts/ccip/Move.lock create mode 100644 chains/sui/contracts/ccip/Move.toml create mode 100644 chains/sui/contracts/ccip/sources/fee_quoter.move create mode 100644 chains/sui/contracts/ccip/tests/ccip_tests.move create mode 100644 chains/sui/contracts/ccip_offramp/.gitignore create mode 100644 chains/sui/contracts/ccip_offramp/Move.lock create mode 100644 chains/sui/contracts/ccip_offramp/Move.toml create mode 100644 chains/sui/contracts/ccip_offramp/sources/ocr3_base.move create mode 100644 chains/sui/contracts/ccip_offramp/sources/offramp.move create mode 100644 chains/sui/contracts/ccip_offramp/tests/ccip_offramp_tests.move create mode 100644 chains/sui/contracts/ccip_onramp/.gitignore create mode 100644 chains/sui/contracts/ccip_onramp/Move.lock create mode 100644 chains/sui/contracts/ccip_onramp/Move.toml create mode 100644 chains/sui/contracts/ccip_onramp/sources/ccip_onramp.move create mode 100644 chains/sui/contracts/ccip_onramp/tests/ccip_onramp_tests.move create mode 100644 chains/sui/contracts/firedrill/.gitignore create mode 100644 chains/sui/contracts/firedrill/Move.lock create mode 100644 chains/sui/contracts/firedrill/Move.toml create mode 100644 chains/sui/contracts/firedrill/sources/firedrill.move create mode 100644 chains/sui/contracts/firedrill/tests/firedrill_tests.move diff --git a/chains/sui/contracts/ccip/.gitignore b/chains/sui/contracts/ccip/.gitignore new file mode 100644 index 0000000..813de75 --- /dev/null +++ b/chains/sui/contracts/ccip/.gitignore @@ -0,0 +1,4 @@ +build/* +traces/* +.trace +.coverage* diff --git a/chains/sui/contracts/ccip/Move.lock b/chains/sui/contracts/ccip/Move.lock new file mode 100644 index 0000000..572d170 --- /dev/null +++ b/chains/sui/contracts/ccip/Move.lock @@ -0,0 +1,56 @@ +# @generated by Move, please check-in and do not edit manually. + +[move] +version = 3 +manifest_digest = "FD5E62CCB7099A0B4B6CADEFAB8BDCFF066D52DFAC950B11C7A47C4DE4BE4E79" +deps_digest = "F9B494B64F0615AED0E98FC12A85B85ECD2BC5185C22D30E7F67786BB52E507C" +dependencies = [ + { id = "Bridge", name = "Bridge" }, + { id = "MoveStdlib", name = "MoveStdlib" }, + { id = "Sui", name = "Sui" }, + { id = "SuiSystem", name = "SuiSystem" }, +] + +[[move.package]] +id = "Bridge" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "d75fae3aa7fa3545b5803980a1e0c965b8bbf48e", subdir = "crates/sui-framework/packages/bridge" } + +dependencies = [ + { id = "MoveStdlib", name = "MoveStdlib" }, + { id = "Sui", name = "Sui" }, + { id = "SuiSystem", name = "SuiSystem" }, +] + +[[move.package]] +id = "MoveStdlib" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "d75fae3aa7fa3545b5803980a1e0c965b8bbf48e", subdir = "crates/sui-framework/packages/move-stdlib" } + +[[move.package]] +id = "Sui" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "d75fae3aa7fa3545b5803980a1e0c965b8bbf48e", subdir = "crates/sui-framework/packages/sui-framework" } + +dependencies = [ + { id = "MoveStdlib", name = "MoveStdlib" }, +] + +[[move.package]] +id = "SuiSystem" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "d75fae3aa7fa3545b5803980a1e0c965b8bbf48e", subdir = "crates/sui-framework/packages/sui-system" } + +dependencies = [ + { id = "MoveStdlib", name = "MoveStdlib" }, + { id = "Sui", name = "Sui" }, +] + +[move.toolchain-version] +compiler-version = "1.60.0" +edition = "2024.beta" +flavor = "sui" + +[env] + +[env.testnet] +chain-id = "4c78adac" +original-published-id = "0x13628ef518ad287a2e26aa37581f98759b7de2af85eaf4aa7e4d4e1f6a8ec068" +latest-published-id = "0x13628ef518ad287a2e26aa37581f98759b7de2af85eaf4aa7e4d4e1f6a8ec068" +published-version = "1" diff --git a/chains/sui/contracts/ccip/Move.toml b/chains/sui/contracts/ccip/Move.toml new file mode 100644 index 0000000..1421d9b --- /dev/null +++ b/chains/sui/contracts/ccip/Move.toml @@ -0,0 +1,33 @@ +[package] +name = "ChainlinkCCIP" +edition = "2024.beta" # edition = "legacy" to use legacy (pre-2024) Move +# license = "" # e.g., "MIT", "GPL", "Apache 2.0" +# authors = ["..."] # e.g., ["Joe Smith (joesmith@noemail.com)", "John Snow (johnsnow@noemail.com)"] + +[dependencies] + +# For remote import, use the `{ git = "...", subdir = "...", rev = "..." }`. +# Revision can be a branch, a tag, and a commit hash. +# MyRemotePackage = { git = "https://some.remote/host.git", subdir = "remote/path", rev = "main" } + +# For local dependencies use `local = path`. Path is relative to the package root +# Local = { local = "../path/to" } + +# To resolve a version conflict and force a specific version for dependency +# override use `override = true` +# Override = { local = "../conflicting/version", override = true } + +[addresses] +ccip = "0x0" + +# Named addresses will be accessible in Move as `@name`. They're also exported: +# for example, `std = "0x1"` is exported by the Standard Library. +# alice = "0xA11CE" + +[dev-dependencies] +# The dev-dependencies section allows overriding dependencies for `--test` and +# `--dev` modes. You can introduce test-only dependencies here. +# Local = { local = "../path/to/dev-build" } + +[dev-addresses] +ccip = "0x3000" diff --git a/chains/sui/contracts/ccip/sources/fee_quoter.move b/chains/sui/contracts/ccip/sources/fee_quoter.move new file mode 100644 index 0000000..11dca09 --- /dev/null +++ b/chains/sui/contracts/ccip/sources/fee_quoter.move @@ -0,0 +1,31 @@ +module ccip::fee_quoter; + +use sui::event; + +public struct UsdPerTokenUpdated has copy, drop { + token: address, + usd_per_token: u256, + timestamp: u64, +} + +public struct UsdPerUnitGasUpdated has copy, drop { + dest_chain_selector: u64, + usd_per_unit_gas: u256, + timestamp: u64, +} + +public fun emit_usd_per_token_updated(token: address, usd_per_token: u256) { + event::emit(UsdPerTokenUpdated { + token, + usd_per_token, + timestamp: 1234567890, + }) +} + +public fun emit_usd_per_unit_gas_updated(dest_chain_selector: u64) { + event::emit(UsdPerUnitGasUpdated { + dest_chain_selector, + usd_per_unit_gas: 191919191919, + timestamp: 1234567890, + }) +} diff --git a/chains/sui/contracts/ccip/tests/ccip_tests.move b/chains/sui/contracts/ccip/tests/ccip_tests.move new file mode 100644 index 0000000..d1c360e --- /dev/null +++ b/chains/sui/contracts/ccip/tests/ccip_tests.move @@ -0,0 +1,18 @@ +/* +#[test_only] +module ccip::ccip_tests; +// uncomment this line to import the module +// use ccip::ccip; + +const ENotImplemented: u64 = 0; + +#[test] +fun test_ccip() { + // pass +} + +#[test, expected_failure(abort_code = ::ccip::ccip_tests::ENotImplemented)] +fun test_ccip_fail() { + abort ENotImplemented +} +*/ diff --git a/chains/sui/contracts/ccip_offramp/.gitignore b/chains/sui/contracts/ccip_offramp/.gitignore new file mode 100644 index 0000000..813de75 --- /dev/null +++ b/chains/sui/contracts/ccip_offramp/.gitignore @@ -0,0 +1,4 @@ +build/* +traces/* +.trace +.coverage* diff --git a/chains/sui/contracts/ccip_offramp/Move.lock b/chains/sui/contracts/ccip_offramp/Move.lock new file mode 100644 index 0000000..4229be1 --- /dev/null +++ b/chains/sui/contracts/ccip_offramp/Move.lock @@ -0,0 +1,68 @@ +# @generated by Move, please check-in and do not edit manually. + +[move] +version = 3 +manifest_digest = "191E63EB7323425532C9E6D900F11A0E1D8777C40BC9135F163D5E6E92AB92E1" +deps_digest = "397E6A9F7A624706DBDFEE056CE88391A15876868FD18A88504DA74EB458D697" +dependencies = [ + { id = "Bridge", name = "Bridge" }, + { id = "ChainlinkCCIP", name = "ChainlinkCCIP" }, + { id = "MoveStdlib", name = "MoveStdlib" }, + { id = "Sui", name = "Sui" }, + { id = "SuiSystem", name = "SuiSystem" }, +] + +[[move.package]] +id = "Bridge" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "d75fae3aa7fa3545b5803980a1e0c965b8bbf48e", subdir = "crates/sui-framework/packages/bridge" } + +dependencies = [ + { id = "MoveStdlib", name = "MoveStdlib" }, + { id = "Sui", name = "Sui" }, + { id = "SuiSystem", name = "SuiSystem" }, +] + +[[move.package]] +id = "ChainlinkCCIP" +source = { local = "../ccip" } + +dependencies = [ + { id = "Bridge", name = "Bridge" }, + { id = "MoveStdlib", name = "MoveStdlib" }, + { id = "Sui", name = "Sui" }, + { id = "SuiSystem", name = "SuiSystem" }, +] + +[[move.package]] +id = "MoveStdlib" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "d75fae3aa7fa3545b5803980a1e0c965b8bbf48e", subdir = "crates/sui-framework/packages/move-stdlib" } + +[[move.package]] +id = "Sui" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "d75fae3aa7fa3545b5803980a1e0c965b8bbf48e", subdir = "crates/sui-framework/packages/sui-framework" } + +dependencies = [ + { id = "MoveStdlib", name = "MoveStdlib" }, +] + +[[move.package]] +id = "SuiSystem" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "d75fae3aa7fa3545b5803980a1e0c965b8bbf48e", subdir = "crates/sui-framework/packages/sui-system" } + +dependencies = [ + { id = "MoveStdlib", name = "MoveStdlib" }, + { id = "Sui", name = "Sui" }, +] + +[move.toolchain-version] +compiler-version = "1.60.0" +edition = "2024.beta" +flavor = "sui" + +[env] + +[env.testnet] +chain-id = "4c78adac" +original-published-id = "0x5518e4fd4a96b81157d4565e00eb6fdf87a2337fae5b283a3eaecce14283e104" +latest-published-id = "0x5518e4fd4a96b81157d4565e00eb6fdf87a2337fae5b283a3eaecce14283e104" +published-version = "1" diff --git a/chains/sui/contracts/ccip_offramp/Move.toml b/chains/sui/contracts/ccip_offramp/Move.toml new file mode 100644 index 0000000..19e8df0 --- /dev/null +++ b/chains/sui/contracts/ccip_offramp/Move.toml @@ -0,0 +1,14 @@ +[package] +name = "CCIP_OFFRAMP" +edition = "2024.beta" + +[dependencies] +ChainlinkCCIP = { local = "../ccip" } + +[addresses] +ccip_offramp = "0x0" +ccip = "0x13628ef518ad287a2e26aa37581f98759b7de2af85eaf4aa7e4d4e1f6a8ec068" + +[dev-addresses] +ccip_offramp = "0x1000" +ccip = "0x3000" diff --git a/chains/sui/contracts/ccip_offramp/sources/ocr3_base.move b/chains/sui/contracts/ccip_offramp/sources/ocr3_base.move new file mode 100644 index 0000000..24471e0 --- /dev/null +++ b/chains/sui/contracts/ccip_offramp/sources/ocr3_base.move @@ -0,0 +1,21 @@ +module ccip_offramp::ocr3_base; + +use sui::event; + +public struct ConfigSet has copy, drop { + ocr_plugin_type: u8, + config_digest: vector, + signers: vector>, + transmitters: vector
, + big_f: u8, +} + +public fun emit_config_set() { + event::emit(ConfigSet { + ocr_plugin_type: 1, + config_digest: vector[], + signers: vector[], + transmitters: vector[], + big_f: 2, + }); +} diff --git a/chains/sui/contracts/ccip_offramp/sources/offramp.move b/chains/sui/contracts/ccip_offramp/sources/offramp.move new file mode 100644 index 0000000..c3765b3 --- /dev/null +++ b/chains/sui/contracts/ccip_offramp/sources/offramp.move @@ -0,0 +1,205 @@ +module ccip_offramp::offramp; + +use ccip_offramp::ocr3_base; +use std::ascii; +use std::bcs; +use std::string::{Self, String}; +use std::type_name; +use sui::address; +use sui::clock; +use sui::derived_object; +use sui::event; +use sui::hash; +use sui::package::{Self, UpgradeCap}; +use sui::table::{Self, Table}; +use sui::vec_map::{Self, VecMap}; + +const EXECUTION_STATE_SUCCESS: u8 = 2; + +public struct StaticConfigSet has copy, drop { + chain_selector: u64, +} + +public struct StaticConfig has copy, drop, store { + chain_selector: u64, + rmn_remote: address, + token_admin_registry: address, + nonce_manager: address, +} + +public struct DynamicConfig has copy, drop, store { + fee_quoter: address, + permissionless_execution_threshold_seconds: u32, // The delay before manual exec is enabled +} + +public struct SourceChainConfig has copy, drop, store { + router: address, + is_enabled: bool, + min_seq_nr: u64, + is_rmn_verification_disabled: bool, + on_ramp: vector, +} + +public struct DynamicConfigSet has copy, drop { + dynamic_config: DynamicConfig, +} + +public struct SourceChainConfigSet has copy, drop { + source_chain_selector: u64, + source_chain_config: SourceChainConfig, +} + +public struct PriceUpdates has copy, drop, store { + token_price_updates: vector, + gas_price_updates: vector, +} + +public struct TokenPriceUpdate has copy, drop, store { + source_token: address, + usd_per_token: u256, +} + +public struct GasPriceUpdate has copy, drop, store { + dest_chain_selector: u64, + usd_per_unit_gas: u256, +} + +public struct MerkleRoot has copy, drop, store { + source_chain_selector: u64, + on_ramp_address: vector, + min_seq_nr: u64, + max_seq_nr: u64, + merkle_root: vector, +} + +public struct SkippedAlreadyExecuted has copy, drop { + source_chain_selector: u64, + sequence_number: u64, +} + +public struct ExecutionStateChanged has copy, drop { + source_chain_selector: u64, + sequence_number: u64, + message_id: vector, + message_hash: vector, + state: u8, +} + +public struct CommitReportAccepted has copy, drop { + blessed_merkle_roots: vector, + unblessed_merkle_roots: vector, + price_updates: PriceUpdates, +} + +public struct SkippedReportExecution has copy, drop { + source_chain_selector: u64, +} + +public fun emit_commit_report_accepted( + min_seq_nr: u64, + max_seq_nr: u64, + onramp_address: address, + source_chain_selector: u64, +) { + let mut merkle_root = vector[]; + vector::append(&mut merkle_root, bcs::to_bytes(&onramp_address)); + vector::append(&mut merkle_root, bcs::to_bytes(&min_seq_nr)); + vector::append(&mut merkle_root, bcs::to_bytes(&max_seq_nr)); + + let merkle_root = MerkleRoot { + source_chain_selector, + on_ramp_address: bcs::to_bytes(&onramp_address), + min_seq_nr, + max_seq_nr, + merkle_root, + }; + + event::emit(CommitReportAccepted { + blessed_merkle_roots: vector[], + unblessed_merkle_roots: vector[merkle_root], + price_updates: PriceUpdates { token_price_updates: vector[], gas_price_updates: vector[] }, + }); +} + +public fun emit_skipped_report_execution(source_chain_selector: u64) { + event::emit(SkippedReportExecution { source_chain_selector }); +} + +public fun emit_skipped_already_executed(source_chain_selector: u64, sequence_number: u64) { + event::emit(SkippedAlreadyExecuted { source_chain_selector, sequence_number }); +} + +public fun emit_execution_state_changed(source_chain_selector: u64, index: u64, ctx: &TxContext) { + let mut message_id = vector[]; + message_id.append(bcs::to_bytes(&ctx.sender())); + message_id.append(bcs::to_bytes(&index)); + + let mut message_hash = vector[]; + message_hash.append(bcs::to_bytes(&ctx.sender())); + message_hash.append(bcs::to_bytes(&index)); + + event::emit(ExecutionStateChanged { + source_chain_selector, + sequence_number: index, + message_id, + message_hash, + state: EXECUTION_STATE_SUCCESS, + }); +} + +public fun emit_static_config_set() { + let sui_selector = 1234567890; + event::emit(StaticConfigSet { chain_selector: sui_selector }); +} + +public fun emit_dynamic_config_set() { + let dynamic_config = get_dynamic_config(); + event::emit(DynamicConfigSet { dynamic_config }); +} + +public fun emit_source_chain_config_set() { + let source_chain_config = SourceChainConfig { + router: @ccip, + is_enabled: true, + min_seq_nr: 0, + is_rmn_verification_disabled: false, + on_ramp: bcs::to_bytes(&@ccip), + }; + let sui_selector = 1234567890; + event::emit(SourceChainConfigSet { source_chain_selector: sui_selector, source_chain_config }); +} + +public fun get_static_config(): StaticConfig { + let sui_selector = 1234567890; + StaticConfig { + chain_selector: sui_selector, + rmn_remote: @ccip, + token_admin_registry: @ccip, + nonce_manager: @ccip, + } +} + +public fun get_dynamic_config(): DynamicConfig { + DynamicConfig { + fee_quoter: @ccip, + permissionless_execution_threshold_seconds: 10 as u32, + } +} + +public fun get_source_chain_config(_source_chain_selector: u64): SourceChainConfig { + SourceChainConfig { + router: @ccip, + is_enabled: true, + min_seq_nr: 0, + is_rmn_verification_disabled: false, + on_ramp: bcs::to_bytes(&@ccip), + } +} + +public fun type_and_version(): String { + string::utf8(b"OffRamp 1.6.0") +} + +public fun emit_ocr3_base_config_set() { + ocr3_base::emit_config_set(); +} diff --git a/chains/sui/contracts/ccip_offramp/tests/ccip_offramp_tests.move b/chains/sui/contracts/ccip_offramp/tests/ccip_offramp_tests.move new file mode 100644 index 0000000..5ff304f --- /dev/null +++ b/chains/sui/contracts/ccip_offramp/tests/ccip_offramp_tests.move @@ -0,0 +1,18 @@ +/* +#[test_only] +module ccip_offramp::ccip_offramp_tests; +// uncomment this line to import the module +// use ccip_offramp::ccip_offramp; + +const ENotImplemented: u64 = 0; + +#[test] +fun test_ccip_offramp() { + // pass +} + +#[test, expected_failure(abort_code = ::ccip_offramp::ccip_offramp_tests::ENotImplemented)] +fun test_ccip_offramp_fail() { + abort ENotImplemented +} +*/ diff --git a/chains/sui/contracts/ccip_onramp/.gitignore b/chains/sui/contracts/ccip_onramp/.gitignore new file mode 100644 index 0000000..813de75 --- /dev/null +++ b/chains/sui/contracts/ccip_onramp/.gitignore @@ -0,0 +1,4 @@ +build/* +traces/* +.trace +.coverage* diff --git a/chains/sui/contracts/ccip_onramp/Move.lock b/chains/sui/contracts/ccip_onramp/Move.lock new file mode 100644 index 0000000..c498733 --- /dev/null +++ b/chains/sui/contracts/ccip_onramp/Move.lock @@ -0,0 +1,68 @@ +# @generated by Move, please check-in and do not edit manually. + +[move] +version = 3 +manifest_digest = "2A808F19A77EC083650F1FFB57997D91ADBFFB8F0AB45C130F8816F1EF794A7D" +deps_digest = "397E6A9F7A624706DBDFEE056CE88391A15876868FD18A88504DA74EB458D697" +dependencies = [ + { id = "Bridge", name = "Bridge" }, + { id = "ChainlinkCCIP", name = "ChainlinkCCIP" }, + { id = "MoveStdlib", name = "MoveStdlib" }, + { id = "Sui", name = "Sui" }, + { id = "SuiSystem", name = "SuiSystem" }, +] + +[[move.package]] +id = "Bridge" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "d75fae3aa7fa3545b5803980a1e0c965b8bbf48e", subdir = "crates/sui-framework/packages/bridge" } + +dependencies = [ + { id = "MoveStdlib", name = "MoveStdlib" }, + { id = "Sui", name = "Sui" }, + { id = "SuiSystem", name = "SuiSystem" }, +] + +[[move.package]] +id = "ChainlinkCCIP" +source = { local = "../ccip" } + +dependencies = [ + { id = "Bridge", name = "Bridge" }, + { id = "MoveStdlib", name = "MoveStdlib" }, + { id = "Sui", name = "Sui" }, + { id = "SuiSystem", name = "SuiSystem" }, +] + +[[move.package]] +id = "MoveStdlib" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "d75fae3aa7fa3545b5803980a1e0c965b8bbf48e", subdir = "crates/sui-framework/packages/move-stdlib" } + +[[move.package]] +id = "Sui" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "d75fae3aa7fa3545b5803980a1e0c965b8bbf48e", subdir = "crates/sui-framework/packages/sui-framework" } + +dependencies = [ + { id = "MoveStdlib", name = "MoveStdlib" }, +] + +[[move.package]] +id = "SuiSystem" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "d75fae3aa7fa3545b5803980a1e0c965b8bbf48e", subdir = "crates/sui-framework/packages/sui-system" } + +dependencies = [ + { id = "MoveStdlib", name = "MoveStdlib" }, + { id = "Sui", name = "Sui" }, +] + +[move.toolchain-version] +compiler-version = "1.60.0" +edition = "2024.beta" +flavor = "sui" + +[env] + +[env.testnet] +chain-id = "4c78adac" +original-published-id = "0x467c9ac6ea0c279abe85c53f5f629f54a49d1050ec044492cc31075691386e38" +latest-published-id = "0x467c9ac6ea0c279abe85c53f5f629f54a49d1050ec044492cc31075691386e38" +published-version = "1" diff --git a/chains/sui/contracts/ccip_onramp/Move.toml b/chains/sui/contracts/ccip_onramp/Move.toml new file mode 100644 index 0000000..6a635bc --- /dev/null +++ b/chains/sui/contracts/ccip_onramp/Move.toml @@ -0,0 +1,14 @@ +[package] +name = "CCIP_ONRAMP" +edition = "2024.beta" + +[dependencies] +ChainlinkCCIP = { local = "../ccip" } + +[addresses] +ccip_onramp = "0x0" +ccip = "0x13628ef518ad287a2e26aa37581f98759b7de2af85eaf4aa7e4d4e1f6a8ec068" + +[dev-addresses] +ccip_onramp = "0x4000" +ccip = "0x3000" diff --git a/chains/sui/contracts/ccip_onramp/sources/ccip_onramp.move b/chains/sui/contracts/ccip_onramp/sources/ccip_onramp.move new file mode 100644 index 0000000..ef8732a --- /dev/null +++ b/chains/sui/contracts/ccip_onramp/sources/ccip_onramp.move @@ -0,0 +1,110 @@ +module ccip_onramp::onramp; + +use std::bcs; +use sui::event; + +public struct RampMessageHeader has copy, drop, store { + message_id: vector, + source_chain_selector: u64, + dest_chain_selector: u64, + sequence_number: u64, + nonce: u64, +} + +public struct Sui2AnyRampMessage has copy, drop, store { + header: RampMessageHeader, + sender: address, + data: vector, + receiver: vector, + extra_args: vector, + fee_token: address, + fee_token_amount: u64, + fee_value_juels: u256, + token_amounts: vector, +} + +public struct Sui2AnyTokenTransfer has copy, drop, store { + source_pool_address: address, + // the token address on the destination chain + dest_token_address: vector, + extra_data: vector, // random bytes provided by token pool, e.g. encoded decimals + amount: u64, + dest_exec_data: vector, // destination gas amount +} + +public struct CCIPMessageSent has copy, drop { + dest_chain_selector: u64, + sequence_number: u64, + message: Sui2AnyRampMessage, +} + +public struct DestChainConfigSet has copy, drop { + dest_chain_selector: u64, + sequence_number: u64, + allowlist_enabled: bool, + router: address, +} + +public struct AllowlistSendersAdded has copy, drop { + dest_chain_selector: u64, + senders: vector
, +} + +public struct AllowlistSendersRemoved has copy, drop { + dest_chain_selector: u64, + senders: vector
, +} + +public fun emit_dest_chain_config_set(router: address) { + let sui_selector = 1234567890; + event::emit(DestChainConfigSet { + dest_chain_selector: sui_selector, + sequence_number: 0, + router, + allowlist_enabled: false, + }); +} + +public fun emit_allowlist_senders_added(dest_chain_selector: u64) { + event::emit(AllowlistSendersAdded { dest_chain_selector, senders: vector[] }); +} + +public fun emit_allowlist_senders_removed(dest_chain_selector: u64) { + event::emit(AllowlistSendersRemoved { dest_chain_selector, senders: vector[] }); +} + +public fun emit_ccip_message_sent( + index: u64, + source_chain_selector: u64, + dest_chain_selector: u64, + fee_token: address, + ctx: &TxContext, +) { + let mut message_id = vector[]; + message_id.append(bcs::to_bytes(&ctx.sender())); + message_id.append(bcs::to_bytes(&index)); + + let message = Sui2AnyRampMessage { + header: RampMessageHeader { + message_id, + source_chain_selector, + dest_chain_selector, + sequence_number: index, + nonce: 1, + }, + sender: ctx.sender(), + data: b"123", + receiver: bcs::to_bytes(&ctx.sender()), + extra_args: b"123", + fee_token, + fee_token_amount: 0, + fee_value_juels: 0, + token_amounts: vector[], + }; + + event::emit(CCIPMessageSent { + dest_chain_selector, + sequence_number: index, + message, + }); +} diff --git a/chains/sui/contracts/ccip_onramp/tests/ccip_onramp_tests.move b/chains/sui/contracts/ccip_onramp/tests/ccip_onramp_tests.move new file mode 100644 index 0000000..ee53feb --- /dev/null +++ b/chains/sui/contracts/ccip_onramp/tests/ccip_onramp_tests.move @@ -0,0 +1,18 @@ +/* +#[test_only] +module ccip_onramp::ccip_onramp_tests; +// uncomment this line to import the module +// use ccip_onramp::ccip_onramp; + +const ENotImplemented: u64 = 0; + +#[test] +fun test_ccip_onramp() { + // pass +} + +#[test, expected_failure(abort_code = ::ccip_onramp::ccip_onramp_tests::ENotImplemented)] +fun test_ccip_onramp_fail() { + abort ENotImplemented +} +*/ diff --git a/chains/sui/contracts/firedrill/.gitignore b/chains/sui/contracts/firedrill/.gitignore new file mode 100644 index 0000000..813de75 --- /dev/null +++ b/chains/sui/contracts/firedrill/.gitignore @@ -0,0 +1,4 @@ +build/* +traces/* +.trace +.coverage* diff --git a/chains/sui/contracts/firedrill/Move.lock b/chains/sui/contracts/firedrill/Move.lock new file mode 100644 index 0000000..b5b3b7b --- /dev/null +++ b/chains/sui/contracts/firedrill/Move.lock @@ -0,0 +1,94 @@ +# @generated by Move, please check-in and do not edit manually. + +[move] +version = 3 +manifest_digest = "41C7C5462A0433BF11B6EF3DD29843C1D9856CC4BC337CEDB9EC350BCD37FB2B" +deps_digest = "CAFAD8A7CF51067FB4358215BECB86BD100DD64E57C2AC8A7AE7D74B688F5965" +dependencies = [ + { id = "Bridge", name = "Bridge" }, + { id = "CCIP_OFFRAMP", name = "CCIP_OFFRAMP" }, + { id = "CCIP_ONRAMP", name = "CCIP_ONRAMP" }, + { id = "ChainlinkCCIP", name = "ChainlinkCCIP" }, + { id = "MoveStdlib", name = "MoveStdlib" }, + { id = "Sui", name = "Sui" }, + { id = "SuiSystem", name = "SuiSystem" }, +] + +[[move.package]] +id = "Bridge" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "d75fae3aa7fa3545b5803980a1e0c965b8bbf48e", subdir = "crates/sui-framework/packages/bridge" } + +dependencies = [ + { id = "MoveStdlib", name = "MoveStdlib" }, + { id = "Sui", name = "Sui" }, + { id = "SuiSystem", name = "SuiSystem" }, +] + +[[move.package]] +id = "CCIP_OFFRAMP" +source = { local = "../ccip_offramp" } + +dependencies = [ + { id = "Bridge", name = "Bridge" }, + { id = "ChainlinkCCIP", name = "ChainlinkCCIP" }, + { id = "MoveStdlib", name = "MoveStdlib" }, + { id = "Sui", name = "Sui" }, + { id = "SuiSystem", name = "SuiSystem" }, +] + +[[move.package]] +id = "CCIP_ONRAMP" +source = { local = "../ccip_onramp" } + +dependencies = [ + { id = "Bridge", name = "Bridge" }, + { id = "ChainlinkCCIP", name = "ChainlinkCCIP" }, + { id = "MoveStdlib", name = "MoveStdlib" }, + { id = "Sui", name = "Sui" }, + { id = "SuiSystem", name = "SuiSystem" }, +] + +[[move.package]] +id = "ChainlinkCCIP" +source = { local = "../ccip" } + +dependencies = [ + { id = "Bridge", name = "Bridge" }, + { id = "MoveStdlib", name = "MoveStdlib" }, + { id = "Sui", name = "Sui" }, + { id = "SuiSystem", name = "SuiSystem" }, +] + +[[move.package]] +id = "MoveStdlib" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "d75fae3aa7fa3545b5803980a1e0c965b8bbf48e", subdir = "crates/sui-framework/packages/move-stdlib" } + +[[move.package]] +id = "Sui" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "d75fae3aa7fa3545b5803980a1e0c965b8bbf48e", subdir = "crates/sui-framework/packages/sui-framework" } + +dependencies = [ + { id = "MoveStdlib", name = "MoveStdlib" }, +] + +[[move.package]] +id = "SuiSystem" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "d75fae3aa7fa3545b5803980a1e0c965b8bbf48e", subdir = "crates/sui-framework/packages/sui-system" } + +dependencies = [ + { id = "MoveStdlib", name = "MoveStdlib" }, + { id = "Sui", name = "Sui" }, +] + +[move.toolchain-version] +compiler-version = "1.60.0" +edition = "2024.beta" +flavor = "sui" + +[env] + +[env.testnet] +chain-id = "4c78adac" +original-published-id = "0x2fada702d9f67f74fd42fc437e237c74e674b2eb1a45577573f112605cf8fcfa" +latest-published-id = "0x2fada702d9f67f74fd42fc437e237c74e674b2eb1a45577573f112605cf8fcfa" +published-version = "1" diff --git a/chains/sui/contracts/firedrill/Move.toml b/chains/sui/contracts/firedrill/Move.toml new file mode 100644 index 0000000..f9c2670 --- /dev/null +++ b/chains/sui/contracts/firedrill/Move.toml @@ -0,0 +1,20 @@ +[package] +name = "firedrill" +edition = "2024.beta" + +[dependencies] +CCIP_OFFRAMP = { local = "../ccip_offramp" } +CCIP_ONRAMP = { local = "../ccip_onramp" } +ChainlinkCCIP = { local = "../ccip" } + +[addresses] +firedrill = "0x0" +ccip_offramp = "0x5518e4fd4a96b81157d4565e00eb6fdf87a2337fae5b283a3eaecce14283e104" +ccip = "0x13628ef518ad287a2e26aa37581f98759b7de2af85eaf4aa7e4d4e1f6a8ec068" +ccip_onramp = "0x467c9ac6ea0c279abe85c53f5f629f54a49d1050ec044492cc31075691386e38" + +[dev-addresses] +ccip_offramp = "0x1000" +firedrill = "0x2000" +ccip = "0x3000" +ccip_onramp = "0x4000" diff --git a/chains/sui/contracts/firedrill/sources/firedrill.move b/chains/sui/contracts/firedrill/sources/firedrill.move new file mode 100644 index 0000000..2f7fd1e --- /dev/null +++ b/chains/sui/contracts/firedrill/sources/firedrill.move @@ -0,0 +1,122 @@ +module firedrill::firedrill; + +use ccip::fee_quoter; +use ccip_offramp::offramp; +use ccip_onramp::onramp; +use std::string; + +const ENothingToSend: u64 = 1; +const EMessageAlreadySent: u64 = 2; +const EMessageNotSent: u64 = 3; + +public struct FiredrillState has key { + id: UID, + s_send_last: u64, +} + +fun init(ctx: &mut TxContext) { + let state = FiredrillState { + id: object::new(ctx), + s_send_last: 0, + }; + + transfer::share_object(state); +} + +/// ================================ OFFRAMP FUNCTIONS ================================ + +public fun drill_pending_execution( + state: &FiredrillState, + from: u64, + to: u64, + onramp_address: address, + source_chain_selector: u64, +) { + assert!(from <= to, ENothingToSend); + assert!((to as u64) <= state.s_send_last, EMessageNotSent); + offramp::emit_commit_report_accepted(from, to, onramp_address, source_chain_selector); +} + +public fun drill_offramp_execute( + source_chain_selector: u64, + sequence_number: u64, + ctx: &TxContext, +) { + offramp::emit_skipped_already_executed(source_chain_selector, sequence_number); + offramp::emit_skipped_report_execution(source_chain_selector); + offramp::emit_execution_state_changed(source_chain_selector, sequence_number, ctx); +} + +public fun drill_offramp_initialize() { + offramp::emit_static_config_set(); + offramp::emit_dynamic_config_set(); + offramp::emit_source_chain_config_set(); +} + +public fun prepare_register() { + offramp::emit_source_chain_config_set(); // register OffRamp + offramp::emit_ocr3_base_config_set(); // register OCR3Base +} + +/// ================================ ONRAMP FUNCTIONS ================================ + +public fun drill_onramp_initialize(router: address) { + onramp::emit_dest_chain_config_set(router); +} + +public fun drill_allowlist_senders_added_removed(dest_chain_selector: u64) { + onramp::emit_allowlist_senders_added(dest_chain_selector); + onramp::emit_allowlist_senders_removed(dest_chain_selector); +} + +public fun drill_pending_commit_pending_queue_tx_spike( + state: &mut FiredrillState, + from: u8, + to: u8, + source_chain_selector: u64, + dest_chain_selector: u64, + fee_token: address, + ctx: &TxContext, +) { + assert!(from <= to, ENothingToSend); + assert!((from as u64) > state.s_send_last, EMessageAlreadySent); + + let mut i = from; + while (i <= to) { + onramp::emit_ccip_message_sent( + (i as u64), + source_chain_selector, + dest_chain_selector, + fee_token, + ctx, + ); + i = i + 1; + }; + + state.s_send_last = (to as u64); +} + +/// ================================ FEE QUOTER FUNCTIONS ================================ + +public fun drill_price_registries(dest_chain_selector: u64, token: address, usd_per_token: u256) { + fee_quoter::emit_usd_per_token_updated(token, usd_per_token); + fee_quoter::emit_usd_per_unit_gas_updated(dest_chain_selector); +} + +/// ================================ VIEW FUNCTIONS ================================ + +public fun get_send_last(state: &FiredrillState): u64 { + state.s_send_last +} + +public fun can_execute_range(state: &FiredrillState, from: u8, to: u8): bool { + from <= to && (to as u64) <= state.s_send_last +} + +public fun can_send_range(state: &FiredrillState, from: u8, to: u8): bool { + from <= to && (from as u64) > state.s_send_last +} + +public fun type_and_version(): string::String { + string::utf8(b"FiredrillEntrypoint 1.0.0") +} diff --git a/chains/sui/contracts/firedrill/tests/firedrill_tests.move b/chains/sui/contracts/firedrill/tests/firedrill_tests.move new file mode 100644 index 0000000..85f47c3 --- /dev/null +++ b/chains/sui/contracts/firedrill/tests/firedrill_tests.move @@ -0,0 +1,18 @@ +/* +#[test_only] +module firedrill::firedrill_tests; +// uncomment this line to import the module +// use firedrill::firedrill; + +const ENotImplemented: u64 = 0; + +#[test] +fun test_firedrill() { + // pass +} + +#[test, expected_failure(abort_code = ::firedrill::firedrill_tests::ENotImplemented)] +fun test_firedrill_fail() { + abort ENotImplemented +} +*/ From 85c88656743b3616fe4dcf0abda78dc83142e6fe Mon Sep 17 00:00:00 2001 From: FelixFan1992 Date: Wed, 3 Dec 2025 14:58:36 -0500 Subject: [PATCH 02/12] update --- chains/sui/contracts/ccip/Move.lock | 4 +-- .../contracts/ccip/sources/fee_quoter.move | 13 +++---- chains/sui/contracts/ccip_offramp/Move.lock | 6 ++-- chains/sui/contracts/ccip_offramp/Move.toml | 2 +- .../ccip_offramp/sources/ocr3_base.move | 6 +++- .../ccip_offramp/sources/offramp.move | 6 ++-- chains/sui/contracts/ccip_onramp/Move.lock | 6 ++-- chains/sui/contracts/ccip_onramp/Move.toml | 2 +- .../ccip_onramp/sources/ccip_onramp.move | 13 ++++--- chains/sui/contracts/firedrill/Move.lock | 6 ++-- chains/sui/contracts/firedrill/Move.toml | 6 ++-- .../firedrill/sources/firedrill.move | 34 ++++++++----------- 12 files changed, 51 insertions(+), 53 deletions(-) diff --git a/chains/sui/contracts/ccip/Move.lock b/chains/sui/contracts/ccip/Move.lock index 572d170..ab17495 100644 --- a/chains/sui/contracts/ccip/Move.lock +++ b/chains/sui/contracts/ccip/Move.lock @@ -51,6 +51,6 @@ flavor = "sui" [env.testnet] chain-id = "4c78adac" -original-published-id = "0x13628ef518ad287a2e26aa37581f98759b7de2af85eaf4aa7e4d4e1f6a8ec068" -latest-published-id = "0x13628ef518ad287a2e26aa37581f98759b7de2af85eaf4aa7e4d4e1f6a8ec068" +original-published-id = "0x812518d872cc4064a28561244b6da7658abe596a46bf582cdb5eba834772ad25" +latest-published-id = "0x812518d872cc4064a28561244b6da7658abe596a46bf582cdb5eba834772ad25" published-version = "1" diff --git a/chains/sui/contracts/ccip/sources/fee_quoter.move b/chains/sui/contracts/ccip/sources/fee_quoter.move index 11dca09..25dee86 100644 --- a/chains/sui/contracts/ccip/sources/fee_quoter.move +++ b/chains/sui/contracts/ccip/sources/fee_quoter.move @@ -1,5 +1,6 @@ module ccip::fee_quoter; +use sui::clock; use sui::event; public struct UsdPerTokenUpdated has copy, drop { @@ -14,18 +15,18 @@ public struct UsdPerUnitGasUpdated has copy, drop { timestamp: u64, } -public fun emit_usd_per_token_updated(token: address, usd_per_token: u256) { +public fun emit_usd_per_token_updated(clock: &clock::Clock, token: address, usd_per_token: u256) { event::emit(UsdPerTokenUpdated { token, usd_per_token, - timestamp: 1234567890, + timestamp: clock.timestamp_ms(), }) } -public fun emit_usd_per_unit_gas_updated(dest_chain_selector: u64) { +public fun emit_usd_per_unit_gas_updated(clock: &clock::Clock, usd_per_unit_gas: u256) { event::emit(UsdPerUnitGasUpdated { - dest_chain_selector, - usd_per_unit_gas: 191919191919, - timestamp: 1234567890, + dest_chain_selector: 9762610643973837292, + usd_per_unit_gas, + timestamp: clock.timestamp_ms(), }) } diff --git a/chains/sui/contracts/ccip_offramp/Move.lock b/chains/sui/contracts/ccip_offramp/Move.lock index 4229be1..4e7e63a 100644 --- a/chains/sui/contracts/ccip_offramp/Move.lock +++ b/chains/sui/contracts/ccip_offramp/Move.lock @@ -2,7 +2,7 @@ [move] version = 3 -manifest_digest = "191E63EB7323425532C9E6D900F11A0E1D8777C40BC9135F163D5E6E92AB92E1" +manifest_digest = "087A7F92D289D404CD6DEC6729FB446DF0C4ED6213DE125DCCE4632082B08FF7" deps_digest = "397E6A9F7A624706DBDFEE056CE88391A15876868FD18A88504DA74EB458D697" dependencies = [ { id = "Bridge", name = "Bridge" }, @@ -63,6 +63,6 @@ flavor = "sui" [env.testnet] chain-id = "4c78adac" -original-published-id = "0x5518e4fd4a96b81157d4565e00eb6fdf87a2337fae5b283a3eaecce14283e104" -latest-published-id = "0x5518e4fd4a96b81157d4565e00eb6fdf87a2337fae5b283a3eaecce14283e104" +original-published-id = "0xfdf0dedffe5c99a8c82141c37713c9b3116faca4aa8f6e06fad4720441a0ee00" +latest-published-id = "0xfdf0dedffe5c99a8c82141c37713c9b3116faca4aa8f6e06fad4720441a0ee00" published-version = "1" diff --git a/chains/sui/contracts/ccip_offramp/Move.toml b/chains/sui/contracts/ccip_offramp/Move.toml index 19e8df0..e205a22 100644 --- a/chains/sui/contracts/ccip_offramp/Move.toml +++ b/chains/sui/contracts/ccip_offramp/Move.toml @@ -7,7 +7,7 @@ ChainlinkCCIP = { local = "../ccip" } [addresses] ccip_offramp = "0x0" -ccip = "0x13628ef518ad287a2e26aa37581f98759b7de2af85eaf4aa7e4d4e1f6a8ec068" +ccip = "0x812518d872cc4064a28561244b6da7658abe596a46bf582cdb5eba834772ad25" [dev-addresses] ccip_offramp = "0x1000" diff --git a/chains/sui/contracts/ccip_offramp/sources/ocr3_base.move b/chains/sui/contracts/ccip_offramp/sources/ocr3_base.move index 24471e0..1c17301 100644 --- a/chains/sui/contracts/ccip_offramp/sources/ocr3_base.move +++ b/chains/sui/contracts/ccip_offramp/sources/ocr3_base.move @@ -15,7 +15,11 @@ public fun emit_config_set() { ocr_plugin_type: 1, config_digest: vector[], signers: vector[], - transmitters: vector[], + transmitters: vector[ + @0x7f8e09ea5a9d6e72854af8d6fa3e4d6f5466d9c11b498e0d9d4f64d8cabe8d32, + @0xc8cc7f57a25e6e96e6be7bcd606a1a8d59d85d757d08e7e045e87a8cfe0bcbc7, + @0x5, + ], big_f: 2, }); } diff --git a/chains/sui/contracts/ccip_offramp/sources/offramp.move b/chains/sui/contracts/ccip_offramp/sources/offramp.move index c3765b3..ef0ab0d 100644 --- a/chains/sui/contracts/ccip_offramp/sources/offramp.move +++ b/chains/sui/contracts/ccip_offramp/sources/offramp.move @@ -148,7 +148,7 @@ public fun emit_execution_state_changed(source_chain_selector: u64, index: u64, } public fun emit_static_config_set() { - let sui_selector = 1234567890; + let sui_selector = 9762610643973837292; event::emit(StaticConfigSet { chain_selector: sui_selector }); } @@ -165,12 +165,12 @@ public fun emit_source_chain_config_set() { is_rmn_verification_disabled: false, on_ramp: bcs::to_bytes(&@ccip), }; - let sui_selector = 1234567890; + let sui_selector = 9762610643973837292; event::emit(SourceChainConfigSet { source_chain_selector: sui_selector, source_chain_config }); } public fun get_static_config(): StaticConfig { - let sui_selector = 1234567890; + let sui_selector = 9762610643973837292; StaticConfig { chain_selector: sui_selector, rmn_remote: @ccip, diff --git a/chains/sui/contracts/ccip_onramp/Move.lock b/chains/sui/contracts/ccip_onramp/Move.lock index c498733..0258008 100644 --- a/chains/sui/contracts/ccip_onramp/Move.lock +++ b/chains/sui/contracts/ccip_onramp/Move.lock @@ -2,7 +2,7 @@ [move] version = 3 -manifest_digest = "2A808F19A77EC083650F1FFB57997D91ADBFFB8F0AB45C130F8816F1EF794A7D" +manifest_digest = "2351C31B38F590974896DA9BAAD8FDE09B40AE483DFECA12DC061496F6FBA511" deps_digest = "397E6A9F7A624706DBDFEE056CE88391A15876868FD18A88504DA74EB458D697" dependencies = [ { id = "Bridge", name = "Bridge" }, @@ -63,6 +63,6 @@ flavor = "sui" [env.testnet] chain-id = "4c78adac" -original-published-id = "0x467c9ac6ea0c279abe85c53f5f629f54a49d1050ec044492cc31075691386e38" -latest-published-id = "0x467c9ac6ea0c279abe85c53f5f629f54a49d1050ec044492cc31075691386e38" +original-published-id = "0xefdd438f90dc0c59e79f42ef07fed3d2496cbe1dfb0d1797d365887e591db7e9" +latest-published-id = "0xefdd438f90dc0c59e79f42ef07fed3d2496cbe1dfb0d1797d365887e591db7e9" published-version = "1" diff --git a/chains/sui/contracts/ccip_onramp/Move.toml b/chains/sui/contracts/ccip_onramp/Move.toml index 6a635bc..fbf7386 100644 --- a/chains/sui/contracts/ccip_onramp/Move.toml +++ b/chains/sui/contracts/ccip_onramp/Move.toml @@ -7,7 +7,7 @@ ChainlinkCCIP = { local = "../ccip" } [addresses] ccip_onramp = "0x0" -ccip = "0x13628ef518ad287a2e26aa37581f98759b7de2af85eaf4aa7e4d4e1f6a8ec068" +ccip = "0x812518d872cc4064a28561244b6da7658abe596a46bf582cdb5eba834772ad25" [dev-addresses] ccip_onramp = "0x4000" diff --git a/chains/sui/contracts/ccip_onramp/sources/ccip_onramp.move b/chains/sui/contracts/ccip_onramp/sources/ccip_onramp.move index ef8732a..15cefe4 100644 --- a/chains/sui/contracts/ccip_onramp/sources/ccip_onramp.move +++ b/chains/sui/contracts/ccip_onramp/sources/ccip_onramp.move @@ -56,7 +56,7 @@ public struct AllowlistSendersRemoved has copy, drop { } public fun emit_dest_chain_config_set(router: address) { - let sui_selector = 1234567890; + let sui_selector = 9762610643973837292; event::emit(DestChainConfigSet { dest_chain_selector: sui_selector, sequence_number: 0, @@ -75,9 +75,8 @@ public fun emit_allowlist_senders_removed(dest_chain_selector: u64) { public fun emit_ccip_message_sent( index: u64, - source_chain_selector: u64, - dest_chain_selector: u64, fee_token: address, + receiver: address, ctx: &TxContext, ) { let mut message_id = vector[]; @@ -87,14 +86,14 @@ public fun emit_ccip_message_sent( let message = Sui2AnyRampMessage { header: RampMessageHeader { message_id, - source_chain_selector, - dest_chain_selector, + source_chain_selector: 9762610643973837292, + dest_chain_selector: 9762610643973837292, sequence_number: index, nonce: 1, }, sender: ctx.sender(), data: b"123", - receiver: bcs::to_bytes(&ctx.sender()), + receiver: bcs::to_bytes(&receiver), extra_args: b"123", fee_token, fee_token_amount: 0, @@ -103,7 +102,7 @@ public fun emit_ccip_message_sent( }; event::emit(CCIPMessageSent { - dest_chain_selector, + dest_chain_selector: 9762610643973837292, sequence_number: index, message, }); diff --git a/chains/sui/contracts/firedrill/Move.lock b/chains/sui/contracts/firedrill/Move.lock index b5b3b7b..fd3ccc7 100644 --- a/chains/sui/contracts/firedrill/Move.lock +++ b/chains/sui/contracts/firedrill/Move.lock @@ -2,7 +2,7 @@ [move] version = 3 -manifest_digest = "41C7C5462A0433BF11B6EF3DD29843C1D9856CC4BC337CEDB9EC350BCD37FB2B" +manifest_digest = "1E0C86FB2A546485FA3FD6A66CF82AD13234C8C9D4C704A8611519CA65FD561F" deps_digest = "CAFAD8A7CF51067FB4358215BECB86BD100DD64E57C2AC8A7AE7D74B688F5965" dependencies = [ { id = "Bridge", name = "Bridge" }, @@ -89,6 +89,6 @@ flavor = "sui" [env.testnet] chain-id = "4c78adac" -original-published-id = "0x2fada702d9f67f74fd42fc437e237c74e674b2eb1a45577573f112605cf8fcfa" -latest-published-id = "0x2fada702d9f67f74fd42fc437e237c74e674b2eb1a45577573f112605cf8fcfa" +original-published-id = "0x278ab864e1fdd6504771c79dbc2775a408562dd1244a468a1a2f603ceae7c094" +latest-published-id = "0x278ab864e1fdd6504771c79dbc2775a408562dd1244a468a1a2f603ceae7c094" published-version = "1" diff --git a/chains/sui/contracts/firedrill/Move.toml b/chains/sui/contracts/firedrill/Move.toml index f9c2670..a65bcf7 100644 --- a/chains/sui/contracts/firedrill/Move.toml +++ b/chains/sui/contracts/firedrill/Move.toml @@ -9,9 +9,9 @@ ChainlinkCCIP = { local = "../ccip" } [addresses] firedrill = "0x0" -ccip_offramp = "0x5518e4fd4a96b81157d4565e00eb6fdf87a2337fae5b283a3eaecce14283e104" -ccip = "0x13628ef518ad287a2e26aa37581f98759b7de2af85eaf4aa7e4d4e1f6a8ec068" -ccip_onramp = "0x467c9ac6ea0c279abe85c53f5f629f54a49d1050ec044492cc31075691386e38" +ccip_offramp = "0xfdf0dedffe5c99a8c82141c37713c9b3116faca4aa8f6e06fad4720441a0ee00" +ccip = "0x812518d872cc4064a28561244b6da7658abe596a46bf582cdb5eba834772ad25" +ccip_onramp = "0xefdd438f90dc0c59e79f42ef07fed3d2496cbe1dfb0d1797d365887e591db7e9" [dev-addresses] ccip_offramp = "0x1000" diff --git a/chains/sui/contracts/firedrill/sources/firedrill.move b/chains/sui/contracts/firedrill/sources/firedrill.move index 2f7fd1e..724d6ba 100644 --- a/chains/sui/contracts/firedrill/sources/firedrill.move +++ b/chains/sui/contracts/firedrill/sources/firedrill.move @@ -4,6 +4,7 @@ use ccip::fee_quoter; use ccip_offramp::offramp; use ccip_onramp::onramp; use std::string; +use sui::clock; const ENothingToSend: u64 = 1; const EMessageAlreadySent: u64 = 2; @@ -30,21 +31,16 @@ public fun drill_pending_execution( from: u64, to: u64, onramp_address: address, - source_chain_selector: u64, ) { assert!(from <= to, ENothingToSend); assert!((to as u64) <= state.s_send_last, EMessageNotSent); - offramp::emit_commit_report_accepted(from, to, onramp_address, source_chain_selector); + offramp::emit_commit_report_accepted(from, to, onramp_address, 9762610643973837292); } -public fun drill_offramp_execute( - source_chain_selector: u64, - sequence_number: u64, - ctx: &TxContext, -) { - offramp::emit_skipped_already_executed(source_chain_selector, sequence_number); - offramp::emit_skipped_report_execution(source_chain_selector); - offramp::emit_execution_state_changed(source_chain_selector, sequence_number, ctx); +public fun drill_offramp_execute(sequence_number: u64, ctx: &TxContext) { + offramp::emit_skipped_already_executed(9762610643973837292, sequence_number); + offramp::emit_skipped_report_execution(9762610643973837292); + offramp::emit_execution_state_changed(9762610643973837292, sequence_number, ctx); } public fun drill_offramp_initialize() { @@ -64,18 +60,17 @@ public fun drill_onramp_initialize(router: address) { onramp::emit_dest_chain_config_set(router); } -public fun drill_allowlist_senders_added_removed(dest_chain_selector: u64) { - onramp::emit_allowlist_senders_added(dest_chain_selector); - onramp::emit_allowlist_senders_removed(dest_chain_selector); +public fun drill_allowlist_senders_added_removed() { + onramp::emit_allowlist_senders_added(9762610643973837292); + onramp::emit_allowlist_senders_removed(9762610643973837292); } public fun drill_pending_commit_pending_queue_tx_spike( state: &mut FiredrillState, from: u8, to: u8, - source_chain_selector: u64, - dest_chain_selector: u64, fee_token: address, + receiver: address, ctx: &TxContext, ) { assert!(from <= to, ENothingToSend); @@ -85,9 +80,8 @@ public fun drill_pending_commit_pending_queue_tx_spike( while (i <= to) { onramp::emit_ccip_message_sent( (i as u64), - source_chain_selector, - dest_chain_selector, fee_token, + receiver, ctx, ); i = i + 1; @@ -98,9 +92,9 @@ public fun drill_pending_commit_pending_queue_tx_spike( /// ================================ FEE QUOTER FUNCTIONS ================================ -public fun drill_price_registries(dest_chain_selector: u64, token: address, usd_per_token: u256) { - fee_quoter::emit_usd_per_token_updated(token, usd_per_token); - fee_quoter::emit_usd_per_unit_gas_updated(dest_chain_selector); +public fun drill_price_registries(clock: &clock::Clock, token: address, usd_per_token: u256) { + fee_quoter::emit_usd_per_token_updated(clock, token, usd_per_token); + fee_quoter::emit_usd_per_unit_gas_updated(clock, 9762610643973837292); } /// ================================ VIEW FUNCTIONS ================================ From 0b6256d446c2f33c59f7aa797527e5b1a10e952d Mon Sep 17 00:00:00 2001 From: FelixFan1992 Date: Thu, 4 Dec 2025 12:06:20 -0500 Subject: [PATCH 03/12] update --- chains/sui/contracts/ccip_offramp/Move.lock | 6 +- .../ccip_offramp/sources/offramp.move | 67 +++++++++++++++++++ chains/sui/contracts/ccip_onramp/Move.lock | 6 +- .../sources/{ccip_onramp.move => onramp.move} | 54 +++++++++++++++ 4 files changed, 127 insertions(+), 6 deletions(-) rename chains/sui/contracts/ccip_onramp/sources/{ccip_onramp.move => onramp.move} (69%) diff --git a/chains/sui/contracts/ccip_offramp/Move.lock b/chains/sui/contracts/ccip_offramp/Move.lock index 4e7e63a..fcd40a9 100644 --- a/chains/sui/contracts/ccip_offramp/Move.lock +++ b/chains/sui/contracts/ccip_offramp/Move.lock @@ -55,7 +55,7 @@ dependencies = [ ] [move.toolchain-version] -compiler-version = "1.60.0" +compiler-version = "1.61.2" edition = "2024.beta" flavor = "sui" @@ -63,6 +63,6 @@ flavor = "sui" [env.testnet] chain-id = "4c78adac" -original-published-id = "0xfdf0dedffe5c99a8c82141c37713c9b3116faca4aa8f6e06fad4720441a0ee00" -latest-published-id = "0xfdf0dedffe5c99a8c82141c37713c9b3116faca4aa8f6e06fad4720441a0ee00" +original-published-id = "0x37befbaa317c9b26491a20bc94aa2a5240d1542b76f9918bb06ead2f553a76e8" +latest-published-id = "0x37befbaa317c9b26491a20bc94aa2a5240d1542b76f9918bb06ead2f553a76e8" published-version = "1" diff --git a/chains/sui/contracts/ccip_offramp/sources/offramp.move b/chains/sui/contracts/ccip_offramp/sources/offramp.move index ef0ab0d..ccc8828 100644 --- a/chains/sui/contracts/ccip_offramp/sources/offramp.move +++ b/chains/sui/contracts/ccip_offramp/sources/offramp.move @@ -16,6 +16,15 @@ use sui::vec_map::{Self, VecMap}; const EXECUTION_STATE_SUCCESS: u8 = 2; +public struct OffRampObject has key { + id: UID, +} + +public struct OffRampStatePointer has key, store { + id: UID, + off_ramp_object_id: address, +} + public struct StaticConfigSet has copy, drop { chain_selector: u64, } @@ -95,6 +104,36 @@ public struct SkippedReportExecution has copy, drop { source_chain_selector: u64, } +public struct OffRampState has key, store { + id: UID, + package_ids: vector
, +} + +public struct OFFRAMP has drop {} + +fun init(otw: OFFRAMP, ctx: &mut TxContext) { + let mut off_ramp_object = OffRampObject { id: object::new(ctx) }; + + let pointer = OffRampStatePointer { + id: object::new(ctx), + off_ramp_object_id: object::id_address(&off_ramp_object), + }; + + let tn = type_name::with_original_ids(); + let package_bytes = ascii::into_bytes(tn.address_string()); + let package_id = address::from_ascii_bytes(&package_bytes); + + let state = OffRampState { + id: derived_object::claim(&mut off_ramp_object.id, b"OffRampState"), + package_ids: vector[package_id], + }; + + transfer::share_object(state); + transfer::share_object(off_ramp_object); + + transfer::transfer(pointer, package_id); +} + public fun emit_commit_report_accepted( min_seq_nr: u64, max_seq_nr: u64, @@ -203,3 +242,31 @@ public fun type_and_version(): String { public fun emit_ocr3_base_config_set() { ocr3_base::emit_config_set(); } + +public fun get_ccip_package_id(): address { + @ccip +} + +public fun get_all_source_chain_configs(): (vector, vector) { + let sui_selector = 9762610643973837292; + let source_chain_selectors = vector[sui_selector]; + let source_chain_config = SourceChainConfig { + router: @ccip, + is_enabled: true, + min_seq_nr: 2, + is_rmn_verification_disabled: false, + on_ramp: bcs::to_bytes(&@ccip), + }; + + (source_chain_selectors, vector[source_chain_config]) +} + +public fun add_package_id(state: &mut OffRampState, package_id: address) { + state.package_ids.push_back(package_id); +} + +public fun remove_package_id(state: &mut OffRampState, package_id: address) { + let (found, idx) = state.package_ids.index_of(&package_id); + assert!(found, 1); + state.package_ids.swap_remove(idx); +} diff --git a/chains/sui/contracts/ccip_onramp/Move.lock b/chains/sui/contracts/ccip_onramp/Move.lock index 0258008..5290fba 100644 --- a/chains/sui/contracts/ccip_onramp/Move.lock +++ b/chains/sui/contracts/ccip_onramp/Move.lock @@ -55,7 +55,7 @@ dependencies = [ ] [move.toolchain-version] -compiler-version = "1.60.0" +compiler-version = "1.61.2" edition = "2024.beta" flavor = "sui" @@ -63,6 +63,6 @@ flavor = "sui" [env.testnet] chain-id = "4c78adac" -original-published-id = "0xefdd438f90dc0c59e79f42ef07fed3d2496cbe1dfb0d1797d365887e591db7e9" -latest-published-id = "0xefdd438f90dc0c59e79f42ef07fed3d2496cbe1dfb0d1797d365887e591db7e9" +original-published-id = "0x7856c556e764ca4e838979b2dd0d2ffd8944b3ab4223bf6d116fe8a922aacb2d" +latest-published-id = "0x7856c556e764ca4e838979b2dd0d2ffd8944b3ab4223bf6d116fe8a922aacb2d" published-version = "1" diff --git a/chains/sui/contracts/ccip_onramp/sources/ccip_onramp.move b/chains/sui/contracts/ccip_onramp/sources/onramp.move similarity index 69% rename from chains/sui/contracts/ccip_onramp/sources/ccip_onramp.move rename to chains/sui/contracts/ccip_onramp/sources/onramp.move index 15cefe4..6fad29e 100644 --- a/chains/sui/contracts/ccip_onramp/sources/ccip_onramp.move +++ b/chains/sui/contracts/ccip_onramp/sources/onramp.move @@ -1,7 +1,34 @@ module ccip_onramp::onramp; +use std::ascii; use std::bcs; +use std::string::{Self, String}; +use std::type_name; +use sui::address; +use sui::derived_object; use sui::event; +use sui::object; +use sui::transfer; + +public fun type_and_version(): String { + string::utf8(b"OnRamp 1.6.0") +} + +public struct ONRAMP has drop {} + +public struct OnRampState has key, store { + id: UID, + package_ids: vector
, +} + +public struct OnRampObject has key { + id: UID, +} + +public struct OnRampStatePointer has key, store { + id: UID, + on_ramp_object_id: address, +} public struct RampMessageHeader has copy, drop, store { message_id: vector, @@ -55,6 +82,29 @@ public struct AllowlistSendersRemoved has copy, drop { senders: vector
, } +fun init(otw: ONRAMP, ctx: &mut TxContext) { + let mut on_ramp_object = OnRampObject { id: object::new(ctx) }; + + let pointer = OnRampStatePointer { + id: object::new(ctx), + on_ramp_object_id: object::id_address(&on_ramp_object), + }; + + let tn = type_name::with_original_ids(); + let package_bytes = ascii::into_bytes(tn.address_string()); + let package_id = address::from_ascii_bytes(&package_bytes); + + let state = OnRampState { + id: derived_object::claim(&mut on_ramp_object.id, b"OnRampState"), + package_ids: vector[package_id], + }; + + transfer::share_object(state); + transfer::share_object(on_ramp_object); + + transfer::transfer(pointer, package_id); +} + public fun emit_dest_chain_config_set(router: address) { let sui_selector = 9762610643973837292; event::emit(DestChainConfigSet { @@ -107,3 +157,7 @@ public fun emit_ccip_message_sent( message, }); } + +public fun get_ccip_package_id(): address { + @ccip +} From 9b30220540660030e8fe95d31ad70dc772504bb8 Mon Sep 17 00:00:00 2001 From: FelixFan1992 Date: Thu, 4 Dec 2025 14:39:22 -0500 Subject: [PATCH 04/12] update --- chains/sui/contracts/ccip/Move.lock | 6 +- .../contracts/ccip/sources/state_object.move | 65 +++++++++++ chains/sui/contracts/ccip_offramp/Move.lock | 14 +-- chains/sui/contracts/ccip_offramp/Move.toml | 3 +- .../ccip_offramp/sources/offramp.move | 6 +- chains/sui/contracts/ccip_onramp/Move.lock | 14 +-- chains/sui/contracts/ccip_onramp/Move.toml | 2 +- chains/sui/contracts/ccip_router/.gitignore | 4 + chains/sui/contracts/ccip_router/Move.lock | 56 ++++++++++ chains/sui/contracts/ccip_router/Move.toml | 36 +++++++ .../ccip_router/sources/ccip_router.move | 101 ++++++++++++++++++ .../ccip_router/tests/ccip_router_tests.move | 18 ++++ 12 files changed, 303 insertions(+), 22 deletions(-) create mode 100644 chains/sui/contracts/ccip/sources/state_object.move create mode 100644 chains/sui/contracts/ccip_router/.gitignore create mode 100644 chains/sui/contracts/ccip_router/Move.lock create mode 100644 chains/sui/contracts/ccip_router/Move.toml create mode 100644 chains/sui/contracts/ccip_router/sources/ccip_router.move create mode 100644 chains/sui/contracts/ccip_router/tests/ccip_router_tests.move diff --git a/chains/sui/contracts/ccip/Move.lock b/chains/sui/contracts/ccip/Move.lock index ab17495..637527c 100644 --- a/chains/sui/contracts/ccip/Move.lock +++ b/chains/sui/contracts/ccip/Move.lock @@ -43,7 +43,7 @@ dependencies = [ ] [move.toolchain-version] -compiler-version = "1.60.0" +compiler-version = "1.61.2" edition = "2024.beta" flavor = "sui" @@ -51,6 +51,6 @@ flavor = "sui" [env.testnet] chain-id = "4c78adac" -original-published-id = "0x812518d872cc4064a28561244b6da7658abe596a46bf582cdb5eba834772ad25" -latest-published-id = "0x812518d872cc4064a28561244b6da7658abe596a46bf582cdb5eba834772ad25" +original-published-id = "0x324c505732fadfa5ac2877cdca28a6be28910009e100de8e6e16eb33ed1218dc" +latest-published-id = "0x324c505732fadfa5ac2877cdca28a6be28910009e100de8e6e16eb33ed1218dc" published-version = "1" diff --git a/chains/sui/contracts/ccip/sources/state_object.move b/chains/sui/contracts/ccip/sources/state_object.move new file mode 100644 index 0000000..4d653da --- /dev/null +++ b/chains/sui/contracts/ccip/sources/state_object.move @@ -0,0 +1,65 @@ +module ccip::state_object; + +use std::ascii; +use std::string::{Self, String}; +use std::type_name; +use sui::address; +use sui::derived_object; +use sui::event; +use sui::object; +use sui::transfer; +use sui::vec_map::{Self, VecMap}; + +public fun type_and_version(): String { + string::utf8(b"StateObject 1.6.0") +} + +public struct CCIPObject has key { + id: UID, +} + +public struct CCIPObjectRef has key, store { + id: UID, + package_ids: vector
, +} + +public struct CCIPObjectRefPointer has key, store { + id: UID, + ccip_object_id: address, +} + +public struct STATE_OBJECT has drop {} + +fun init(otw: STATE_OBJECT, ctx: &mut TxContext) { + let mut ccip_object = CCIPObject { id: object::new(ctx) }; + + let mut ref = CCIPObjectRef { + id: derived_object::claim(&mut ccip_object.id, b"CCIPObjectRef"), + package_ids: vector[], + }; + + let pointer = CCIPObjectRefPointer { + id: object::new(ctx), + ccip_object_id: object::id_address(&ccip_object), + }; + + let tn = type_name::with_original_ids(); + let package_bytes = ascii::into_bytes(tn.address_string()); + let package_id = address::from_ascii_bytes(&package_bytes); + ref.package_ids.push_back(package_id); + + transfer::share_object(ref); + transfer::share_object(ccip_object); + + transfer::transfer(pointer, package_id); +} + +public fun add_package_id(ref: &mut CCIPObjectRef, package_id: address) { + ref.package_ids.push_back(package_id); +} + +public fun remove_package_id(ref: &mut CCIPObjectRef, package_id: address) { + let (found, idx) = ref.package_ids.index_of(&package_id); + assert!(found, 1); + ref.package_ids.swap_remove(idx); +} diff --git a/chains/sui/contracts/ccip_offramp/Move.lock b/chains/sui/contracts/ccip_offramp/Move.lock index fcd40a9..7e51b68 100644 --- a/chains/sui/contracts/ccip_offramp/Move.lock +++ b/chains/sui/contracts/ccip_offramp/Move.lock @@ -2,7 +2,7 @@ [move] version = 3 -manifest_digest = "087A7F92D289D404CD6DEC6729FB446DF0C4ED6213DE125DCCE4632082B08FF7" +manifest_digest = "9FB6403833555A79DEC0D55EB4FB59DE3E36C7819687BF9FEFC0DDA9D75EECC2" deps_digest = "397E6A9F7A624706DBDFEE056CE88391A15876868FD18A88504DA74EB458D697" dependencies = [ { id = "Bridge", name = "Bridge" }, @@ -14,7 +14,7 @@ dependencies = [ [[move.package]] id = "Bridge" -source = { git = "https://github.com/MystenLabs/sui.git", rev = "d75fae3aa7fa3545b5803980a1e0c965b8bbf48e", subdir = "crates/sui-framework/packages/bridge" } +source = { git = "https://github.com/MystenLabs/sui.git", rev = "c1f1ae650fb9f9248b39a569400b4420820868db", subdir = "crates/sui-framework/packages/bridge" } dependencies = [ { id = "MoveStdlib", name = "MoveStdlib" }, @@ -35,11 +35,11 @@ dependencies = [ [[move.package]] id = "MoveStdlib" -source = { git = "https://github.com/MystenLabs/sui.git", rev = "d75fae3aa7fa3545b5803980a1e0c965b8bbf48e", subdir = "crates/sui-framework/packages/move-stdlib" } +source = { git = "https://github.com/MystenLabs/sui.git", rev = "c1f1ae650fb9f9248b39a569400b4420820868db", subdir = "crates/sui-framework/packages/move-stdlib" } [[move.package]] id = "Sui" -source = { git = "https://github.com/MystenLabs/sui.git", rev = "d75fae3aa7fa3545b5803980a1e0c965b8bbf48e", subdir = "crates/sui-framework/packages/sui-framework" } +source = { git = "https://github.com/MystenLabs/sui.git", rev = "c1f1ae650fb9f9248b39a569400b4420820868db", subdir = "crates/sui-framework/packages/sui-framework" } dependencies = [ { id = "MoveStdlib", name = "MoveStdlib" }, @@ -47,7 +47,7 @@ dependencies = [ [[move.package]] id = "SuiSystem" -source = { git = "https://github.com/MystenLabs/sui.git", rev = "d75fae3aa7fa3545b5803980a1e0c965b8bbf48e", subdir = "crates/sui-framework/packages/sui-system" } +source = { git = "https://github.com/MystenLabs/sui.git", rev = "c1f1ae650fb9f9248b39a569400b4420820868db", subdir = "crates/sui-framework/packages/sui-system" } dependencies = [ { id = "MoveStdlib", name = "MoveStdlib" }, @@ -63,6 +63,6 @@ flavor = "sui" [env.testnet] chain-id = "4c78adac" -original-published-id = "0x37befbaa317c9b26491a20bc94aa2a5240d1542b76f9918bb06ead2f553a76e8" -latest-published-id = "0x37befbaa317c9b26491a20bc94aa2a5240d1542b76f9918bb06ead2f553a76e8" +original-published-id = "0xe2d83f15195acd57b798610d167dc241fcb30b5cc3808af497c33d97512b7970" +latest-published-id = "0xe2d83f15195acd57b798610d167dc241fcb30b5cc3808af497c33d97512b7970" published-version = "1" diff --git a/chains/sui/contracts/ccip_offramp/Move.toml b/chains/sui/contracts/ccip_offramp/Move.toml index e205a22..aa3ab17 100644 --- a/chains/sui/contracts/ccip_offramp/Move.toml +++ b/chains/sui/contracts/ccip_offramp/Move.toml @@ -7,7 +7,8 @@ ChainlinkCCIP = { local = "../ccip" } [addresses] ccip_offramp = "0x0" -ccip = "0x812518d872cc4064a28561244b6da7658abe596a46bf582cdb5eba834772ad25" +ccip = "0x324c505732fadfa5ac2877cdca28a6be28910009e100de8e6e16eb33ed1218dc" +router = "0x0479e1ecffb87e08cb858d2eda418ad1a8bcf074589a7fd226b38f4fa02f0571" [dev-addresses] ccip_offramp = "0x1000" diff --git a/chains/sui/contracts/ccip_offramp/sources/offramp.move b/chains/sui/contracts/ccip_offramp/sources/offramp.move index ccc8828..69bc01c 100644 --- a/chains/sui/contracts/ccip_offramp/sources/offramp.move +++ b/chains/sui/contracts/ccip_offramp/sources/offramp.move @@ -198,7 +198,7 @@ public fun emit_dynamic_config_set() { public fun emit_source_chain_config_set() { let source_chain_config = SourceChainConfig { - router: @ccip, + router: @router, is_enabled: true, min_seq_nr: 0, is_rmn_verification_disabled: false, @@ -227,7 +227,7 @@ public fun get_dynamic_config(): DynamicConfig { public fun get_source_chain_config(_source_chain_selector: u64): SourceChainConfig { SourceChainConfig { - router: @ccip, + router: @router, is_enabled: true, min_seq_nr: 0, is_rmn_verification_disabled: false, @@ -251,7 +251,7 @@ public fun get_all_source_chain_configs(): (vector, vector, // dest_chain_selector -> on_ramp_package_id +} + +public struct RouterStatePointer has key, store { + id: UID, + router_object_id: address, +} + +public fun type_and_version(): String { + string::utf8(b"Router 1.6.0") +} + +fun init(otw: ROUTER, ctx: &mut TxContext) { + let mut router_object = RouterObject { id: object::new(ctx) }; + + let router = RouterState { + id: derived_object::claim(&mut router_object.id, b"RouterState"), + on_ramp_package_ids: vec_map::empty(), + }; + + let router_state_pointer = RouterStatePointer { + id: object::new(ctx), + router_object_id: object::id_address(&router_object), + }; + + let tn = type_name::with_original_ids(); + let package_bytes = ascii::into_bytes(tn.address_string()); + let package_id = address::from_ascii_bytes(&package_bytes); + + transfer::share_object(router); + transfer::share_object(router_object); + + transfer::transfer(router_state_pointer, package_id); +} + +public fun is_chain_supported(router: &RouterState, dest_chain_selector: u64): bool { + router.on_ramp_package_ids.contains(&dest_chain_selector) +} + +// Returns the on ramp package id for the given destination chain selector. +public fun get_on_ramp(router: &RouterState, dest_chain_selector: u64): address { + assert!(router.on_ramp_package_ids.contains(&dest_chain_selector), EOnrampNotFound); + + *router.on_ramp_package_ids.get(&dest_chain_selector) +} + +public fun get_dest_chains(router: &RouterState): vector { + router.on_ramp_package_ids.keys() +} + +public fun set_on_ramps( + router: &mut RouterState, + dest_chain_selectors: vector, + on_ramp_package_ids: vector
, +) { + assert!(dest_chain_selectors.length() == on_ramp_package_ids.length(), EParamsLengthMismatch); + + let mut i = 0; + let selector_len = dest_chain_selectors.length(); + while (i < selector_len) { + let dest_chain_selector = dest_chain_selectors[i]; + let on_ramp_package_id = on_ramp_package_ids[i]; + assert!(on_ramp_package_id != @0x0, EInvalidOnrampAddress); + + if (router.on_ramp_package_ids.contains(&dest_chain_selector)) { + router.on_ramp_package_ids.remove(&dest_chain_selector); + }; + router.on_ramp_package_ids.insert(dest_chain_selector, on_ramp_package_id); + event::emit(OnRampSet { dest_chain_selector, on_ramp_package_id }); + i = i + 1; + }; +} diff --git a/chains/sui/contracts/ccip_router/tests/ccip_router_tests.move b/chains/sui/contracts/ccip_router/tests/ccip_router_tests.move new file mode 100644 index 0000000..b3e43cf --- /dev/null +++ b/chains/sui/contracts/ccip_router/tests/ccip_router_tests.move @@ -0,0 +1,18 @@ +/* +#[test_only] +module ccip_router::ccip_router_tests; +// uncomment this line to import the module +// use ccip_router::ccip_router; + +const ENotImplemented: u64 = 0; + +#[test] +fun test_ccip_router() { + // pass +} + +#[test, expected_failure(abort_code = ::ccip_router::ccip_router_tests::ENotImplemented)] +fun test_ccip_router_fail() { + abort ENotImplemented +} +*/ From 2e5b60d3ab44a93b4a7ed50f156e4c31166ab1e5 Mon Sep 17 00:00:00 2001 From: FelixFan1992 Date: Fri, 5 Dec 2025 10:33:45 -0500 Subject: [PATCH 05/12] update --- chains/sui/contracts/ccip_offramp/Move.lock | 6 ++-- chains/sui/contracts/ccip_offramp/Move.toml | 1 + .../ccip_offramp/sources/offramp.move | 32 +++++++++++++------ chains/sui/contracts/ccip_onramp/Move.lock | 6 ++-- chains/sui/contracts/ccip_onramp/Move.toml | 1 + .../contracts/ccip_onramp/sources/onramp.move | 7 ++++ 6 files changed, 38 insertions(+), 15 deletions(-) diff --git a/chains/sui/contracts/ccip_offramp/Move.lock b/chains/sui/contracts/ccip_offramp/Move.lock index 7e51b68..8c0f8f0 100644 --- a/chains/sui/contracts/ccip_offramp/Move.lock +++ b/chains/sui/contracts/ccip_offramp/Move.lock @@ -2,7 +2,7 @@ [move] version = 3 -manifest_digest = "9FB6403833555A79DEC0D55EB4FB59DE3E36C7819687BF9FEFC0DDA9D75EECC2" +manifest_digest = "5E2FB83642CF55208C74F33C4D820971ABADF987DCBB07CD86924A1186E49A02" deps_digest = "397E6A9F7A624706DBDFEE056CE88391A15876868FD18A88504DA74EB458D697" dependencies = [ { id = "Bridge", name = "Bridge" }, @@ -63,6 +63,6 @@ flavor = "sui" [env.testnet] chain-id = "4c78adac" -original-published-id = "0xe2d83f15195acd57b798610d167dc241fcb30b5cc3808af497c33d97512b7970" -latest-published-id = "0xe2d83f15195acd57b798610d167dc241fcb30b5cc3808af497c33d97512b7970" +original-published-id = "0x9ffdd040a3ee43d77d438c4ff873fa09c40e4a3027c5d22089f01226d8aac1eb" +latest-published-id = "0x9ffdd040a3ee43d77d438c4ff873fa09c40e4a3027c5d22089f01226d8aac1eb" published-version = "1" diff --git a/chains/sui/contracts/ccip_offramp/Move.toml b/chains/sui/contracts/ccip_offramp/Move.toml index aa3ab17..333695e 100644 --- a/chains/sui/contracts/ccip_offramp/Move.toml +++ b/chains/sui/contracts/ccip_offramp/Move.toml @@ -9,6 +9,7 @@ ChainlinkCCIP = { local = "../ccip" } ccip_offramp = "0x0" ccip = "0x324c505732fadfa5ac2877cdca28a6be28910009e100de8e6e16eb33ed1218dc" router = "0x0479e1ecffb87e08cb858d2eda418ad1a8bcf074589a7fd226b38f4fa02f0571" +onramp = "0x3c766ec5108e6fa83da070599a2c28f58aea0960319bce2d9c020983a8ce122b" [dev-addresses] ccip_offramp = "0x1000" diff --git a/chains/sui/contracts/ccip_offramp/sources/offramp.move b/chains/sui/contracts/ccip_offramp/sources/offramp.move index 69bc01c..8fcb30b 100644 --- a/chains/sui/contracts/ccip_offramp/sources/offramp.move +++ b/chains/sui/contracts/ccip_offramp/sources/offramp.move @@ -1,5 +1,6 @@ module ccip_offramp::offramp; +use ccip::state_object; use ccip_offramp::ocr3_base; use std::ascii; use std::bcs; @@ -191,8 +192,8 @@ public fun emit_static_config_set() { event::emit(StaticConfigSet { chain_selector: sui_selector }); } -public fun emit_dynamic_config_set() { - let dynamic_config = get_dynamic_config(); +public fun emit_dynamic_config_set(ref: &state_object::CCIPObjectRef, state: &OffRampState) { + let dynamic_config = get_dynamic_config(ref, state); event::emit(DynamicConfigSet { dynamic_config }); } @@ -202,13 +203,16 @@ public fun emit_source_chain_config_set() { is_enabled: true, min_seq_nr: 0, is_rmn_verification_disabled: false, - on_ramp: bcs::to_bytes(&@ccip), + on_ramp: bcs::to_bytes(&@onramp), }; let sui_selector = 9762610643973837292; event::emit(SourceChainConfigSet { source_chain_selector: sui_selector, source_chain_config }); } -public fun get_static_config(): StaticConfig { +public fun get_static_config( + ref: &state_object::CCIPObjectRef, + state: &OffRampState, +): StaticConfig { let sui_selector = 9762610643973837292; StaticConfig { chain_selector: sui_selector, @@ -218,20 +222,27 @@ public fun get_static_config(): StaticConfig { } } -public fun get_dynamic_config(): DynamicConfig { +public fun get_dynamic_config( + ref: &state_object::CCIPObjectRef, + state: &OffRampState, +): DynamicConfig { DynamicConfig { fee_quoter: @ccip, permissionless_execution_threshold_seconds: 10 as u32, } } -public fun get_source_chain_config(_source_chain_selector: u64): SourceChainConfig { +public fun get_source_chain_config( + ref: &state_object::CCIPObjectRef, + state: &OffRampState, + source_chain_selector: u64, +): SourceChainConfig { SourceChainConfig { router: @router, is_enabled: true, min_seq_nr: 0, is_rmn_verification_disabled: false, - on_ramp: bcs::to_bytes(&@ccip), + on_ramp: bcs::to_bytes(&@onramp), } } @@ -247,7 +258,10 @@ public fun get_ccip_package_id(): address { @ccip } -public fun get_all_source_chain_configs(): (vector, vector) { +public fun get_all_source_chain_configs( + ref: &state_object::CCIPObjectRef, + state: &OffRampState, +): (vector, vector) { let sui_selector = 9762610643973837292; let source_chain_selectors = vector[sui_selector]; let source_chain_config = SourceChainConfig { @@ -255,7 +269,7 @@ public fun get_all_source_chain_configs(): (vector, vector Date: Mon, 8 Dec 2025 13:42:21 -0500 Subject: [PATCH 06/12] update --- chains/sui/contracts/ccip/Move.lock | 4 +- .../contracts/ccip/sources/fee_quoter.move | 10 +++++ chains/sui/contracts/ccip_offramp/Move.lock | 6 +-- chains/sui/contracts/ccip_offramp/Move.toml | 6 +-- .../ccip_offramp/sources/offramp.move | 25 +++++++++++++ chains/sui/contracts/ccip_onramp/Move.lock | 6 +-- chains/sui/contracts/ccip_onramp/Move.toml | 4 +- .../contracts/ccip_onramp/sources/onramp.move | 37 +++++++++++++++++++ chains/sui/contracts/ccip_router/Move.lock | 4 +- 9 files changed, 87 insertions(+), 15 deletions(-) diff --git a/chains/sui/contracts/ccip/Move.lock b/chains/sui/contracts/ccip/Move.lock index 637527c..04681a5 100644 --- a/chains/sui/contracts/ccip/Move.lock +++ b/chains/sui/contracts/ccip/Move.lock @@ -51,6 +51,6 @@ flavor = "sui" [env.testnet] chain-id = "4c78adac" -original-published-id = "0x324c505732fadfa5ac2877cdca28a6be28910009e100de8e6e16eb33ed1218dc" -latest-published-id = "0x324c505732fadfa5ac2877cdca28a6be28910009e100de8e6e16eb33ed1218dc" +original-published-id = "0xe6763a05a2a7cb9250342d7420c566c6d4255920640c64c399beab47b6313e9b" +latest-published-id = "0xe6763a05a2a7cb9250342d7420c566c6d4255920640c64c399beab47b6313e9b" published-version = "1" diff --git a/chains/sui/contracts/ccip/sources/fee_quoter.move b/chains/sui/contracts/ccip/sources/fee_quoter.move index 25dee86..f081766 100644 --- a/chains/sui/contracts/ccip/sources/fee_quoter.move +++ b/chains/sui/contracts/ccip/sources/fee_quoter.move @@ -30,3 +30,13 @@ public fun emit_usd_per_unit_gas_updated(clock: &clock::Clock, usd_per_unit_gas: timestamp: clock.timestamp_ms(), }) } + +public fun drill_price_registries( + clock: &clock::Clock, + token: address, + usd_per_token: u256, + usd_per_unit_gas: u256, +) { + emit_usd_per_token_updated(clock, token, usd_per_token); + emit_usd_per_unit_gas_updated(clock, usd_per_unit_gas); +} diff --git a/chains/sui/contracts/ccip_offramp/Move.lock b/chains/sui/contracts/ccip_offramp/Move.lock index 8c0f8f0..d9f92a7 100644 --- a/chains/sui/contracts/ccip_offramp/Move.lock +++ b/chains/sui/contracts/ccip_offramp/Move.lock @@ -2,7 +2,7 @@ [move] version = 3 -manifest_digest = "5E2FB83642CF55208C74F33C4D820971ABADF987DCBB07CD86924A1186E49A02" +manifest_digest = "C9D2AB7FB7222570BC056FE5AD83EB18B1A18D097D1FC3EB7EA4B3AB5BF40A62" deps_digest = "397E6A9F7A624706DBDFEE056CE88391A15876868FD18A88504DA74EB458D697" dependencies = [ { id = "Bridge", name = "Bridge" }, @@ -63,6 +63,6 @@ flavor = "sui" [env.testnet] chain-id = "4c78adac" -original-published-id = "0x9ffdd040a3ee43d77d438c4ff873fa09c40e4a3027c5d22089f01226d8aac1eb" -latest-published-id = "0x9ffdd040a3ee43d77d438c4ff873fa09c40e4a3027c5d22089f01226d8aac1eb" +original-published-id = "0x9203785d89be068a04c11b3ae71b1fc7a97ea159014b7c6e732572eb052f0f56" +latest-published-id = "0x9203785d89be068a04c11b3ae71b1fc7a97ea159014b7c6e732572eb052f0f56" published-version = "1" diff --git a/chains/sui/contracts/ccip_offramp/Move.toml b/chains/sui/contracts/ccip_offramp/Move.toml index 333695e..91c8a45 100644 --- a/chains/sui/contracts/ccip_offramp/Move.toml +++ b/chains/sui/contracts/ccip_offramp/Move.toml @@ -7,9 +7,9 @@ ChainlinkCCIP = { local = "../ccip" } [addresses] ccip_offramp = "0x0" -ccip = "0x324c505732fadfa5ac2877cdca28a6be28910009e100de8e6e16eb33ed1218dc" -router = "0x0479e1ecffb87e08cb858d2eda418ad1a8bcf074589a7fd226b38f4fa02f0571" -onramp = "0x3c766ec5108e6fa83da070599a2c28f58aea0960319bce2d9c020983a8ce122b" +ccip = "0xe6763a05a2a7cb9250342d7420c566c6d4255920640c64c399beab47b6313e9b" +router = "0x0d1cefe6e43cc96cbb6b2e7aa261b8be05cbf926a8f83431e1bd6023250b522c" +onramp = "0x2968af0227d9ee35e651bb45e426470cad8a8d28eada9281be5b15a06447fc56" [dev-addresses] ccip_offramp = "0x1000" diff --git a/chains/sui/contracts/ccip_offramp/sources/offramp.move b/chains/sui/contracts/ccip_offramp/sources/offramp.move index 8fcb30b..d939ca2 100644 --- a/chains/sui/contracts/ccip_offramp/sources/offramp.move +++ b/chains/sui/contracts/ccip_offramp/sources/offramp.move @@ -17,6 +17,8 @@ use sui::vec_map::{Self, VecMap}; const EXECUTION_STATE_SUCCESS: u8 = 2; +const ENothingToSend: u64 = 1; + public struct OffRampObject has key { id: UID, } @@ -284,3 +286,26 @@ public fun remove_package_id(state: &mut OffRampState, package_id: address) { assert!(found, 1); state.package_ids.swap_remove(idx); } + +public fun prepare_register() { + emit_source_chain_config_set(); + emit_ocr3_base_config_set(); +} + +public fun drill_pending_execution(state: &OffRampState, from: u8, to: u8) { + assert!(from <= to, ENothingToSend); + + emit_commit_report_accepted((from as u64), (to as u64), @onramp, 9762610643973837292); +} + +public fun drill_offramp_initialize(ref: &state_object::CCIPObjectRef, state: &OffRampState) { + emit_static_config_set(); + emit_dynamic_config_set(ref, state); + emit_source_chain_config_set(); +} + +public fun drill_offramp_execute(ctx: &TxContext) { + emit_skipped_already_executed(9762610643973837292, 1); + emit_skipped_report_execution(9762610643973837292); + emit_execution_state_changed(9762610643973837292, 1, ctx); +} diff --git a/chains/sui/contracts/ccip_onramp/Move.lock b/chains/sui/contracts/ccip_onramp/Move.lock index 072cb92..388dc9c 100644 --- a/chains/sui/contracts/ccip_onramp/Move.lock +++ b/chains/sui/contracts/ccip_onramp/Move.lock @@ -2,7 +2,7 @@ [move] version = 3 -manifest_digest = "7B48290810CA4CF8EDE7334ECF97D13C644E0278C99E7E640A7B0DB6EEF2060D" +manifest_digest = "86679BEA99031DA7562CD5FAA553F62AB9851B6B11BD71C7EE11ABD757DBC6C7" deps_digest = "397E6A9F7A624706DBDFEE056CE88391A15876868FD18A88504DA74EB458D697" dependencies = [ { id = "Bridge", name = "Bridge" }, @@ -63,6 +63,6 @@ flavor = "sui" [env.testnet] chain-id = "4c78adac" -original-published-id = "0x3c766ec5108e6fa83da070599a2c28f58aea0960319bce2d9c020983a8ce122b" -latest-published-id = "0x3c766ec5108e6fa83da070599a2c28f58aea0960319bce2d9c020983a8ce122b" +original-published-id = "0x2968af0227d9ee35e651bb45e426470cad8a8d28eada9281be5b15a06447fc56" +latest-published-id = "0x2968af0227d9ee35e651bb45e426470cad8a8d28eada9281be5b15a06447fc56" published-version = "1" diff --git a/chains/sui/contracts/ccip_onramp/Move.toml b/chains/sui/contracts/ccip_onramp/Move.toml index fce9aed..b4c5760 100644 --- a/chains/sui/contracts/ccip_onramp/Move.toml +++ b/chains/sui/contracts/ccip_onramp/Move.toml @@ -7,8 +7,8 @@ ChainlinkCCIP = { local = "../ccip" } [addresses] ccip_onramp = "0x0" -ccip = "0x324c505732fadfa5ac2877cdca28a6be28910009e100de8e6e16eb33ed1218dc" -router = "0x0479e1ecffb87e08cb858d2eda418ad1a8bcf074589a7fd226b38f4fa02f0571" +ccip = "0xe6763a05a2a7cb9250342d7420c566c6d4255920640c64c399beab47b6313e9b" +router = "0x0d1cefe6e43cc96cbb6b2e7aa261b8be05cbf926a8f83431e1bd6023250b522c" [dev-addresses] ccip_onramp = "0x4000" diff --git a/chains/sui/contracts/ccip_onramp/sources/onramp.move b/chains/sui/contracts/ccip_onramp/sources/onramp.move index fdb9ee6..123e63b 100644 --- a/chains/sui/contracts/ccip_onramp/sources/onramp.move +++ b/chains/sui/contracts/ccip_onramp/sources/onramp.move @@ -10,6 +10,9 @@ use sui::event; use sui::object; use sui::transfer; +const ENothingToSend: u64 = 1; +const EMessageAlreadySent: u64 = 2; + public fun type_and_version(): String { string::utf8(b"OnRamp 1.6.0") } @@ -19,6 +22,7 @@ public struct ONRAMP has drop {} public struct OnRampState has key, store { id: UID, package_ids: vector
, + s_send_last: u64, } public struct OnRampObject has key { @@ -97,6 +101,7 @@ fun init(otw: ONRAMP, ctx: &mut TxContext) { let state = OnRampState { id: derived_object::claim(&mut on_ramp_object.id, b"OnRampState"), package_ids: vector[package_id], + s_send_last: 0, }; transfer::share_object(state); @@ -168,3 +173,35 @@ public fun get_dest_chain_config( ): (u64, bool, address) { (1, false, @router) } + +public fun drill_onramp_initialize(router: address) { + emit_dest_chain_config_set(router); +} + +public fun drill_allowlist_senders_added_removed() { + emit_allowlist_senders_added(9762610643973837292); + emit_allowlist_senders_removed(9762610643973837292); +} + +public fun drill_pending_commit_pending_queue_tx_spike( + state: &mut OnRampState, + from: u8, + to: u8, + fee_token: address, + ctx: &TxContext, +) { + assert!(from <= to, ENothingToSend); + assert!((from as u64) > state.s_send_last, EMessageAlreadySent); + + let mut i = from; + while (i <= to) { + emit_ccip_message_sent((i as u64), fee_token, ctx.sender(), ctx); + i = i + 1; + }; + + state.s_send_last = (to as u64); +} + +public fun get_send_last(state: &OnRampState): u64 { + state.s_send_last +} diff --git a/chains/sui/contracts/ccip_router/Move.lock b/chains/sui/contracts/ccip_router/Move.lock index a0439f8..d88f360 100644 --- a/chains/sui/contracts/ccip_router/Move.lock +++ b/chains/sui/contracts/ccip_router/Move.lock @@ -51,6 +51,6 @@ flavor = "sui" [env.testnet] chain-id = "4c78adac" -original-published-id = "0x0479e1ecffb87e08cb858d2eda418ad1a8bcf074589a7fd226b38f4fa02f0571" -latest-published-id = "0x0479e1ecffb87e08cb858d2eda418ad1a8bcf074589a7fd226b38f4fa02f0571" +original-published-id = "0x0d1cefe6e43cc96cbb6b2e7aa261b8be05cbf926a8f83431e1bd6023250b522c" +latest-published-id = "0x0d1cefe6e43cc96cbb6b2e7aa261b8be05cbf926a8f83431e1bd6023250b522c" published-version = "1" From 25846242f40d98fa78e578bf5afc96a541ee0538 Mon Sep 17 00:00:00 2001 From: FelixFan1992 Date: Wed, 10 Dec 2025 09:22:35 -0500 Subject: [PATCH 07/12] update --- chains/sui/contracts/ccip_offramp/Move.lock | 6 +++--- chains/sui/contracts/ccip_offramp/Move.toml | 2 +- chains/sui/contracts/ccip_onramp/Move.lock | 4 ++-- .../contracts/ccip_onramp/sources/onramp.move | 20 +++++++++++++++++++ 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/chains/sui/contracts/ccip_offramp/Move.lock b/chains/sui/contracts/ccip_offramp/Move.lock index d9f92a7..7110672 100644 --- a/chains/sui/contracts/ccip_offramp/Move.lock +++ b/chains/sui/contracts/ccip_offramp/Move.lock @@ -2,7 +2,7 @@ [move] version = 3 -manifest_digest = "C9D2AB7FB7222570BC056FE5AD83EB18B1A18D097D1FC3EB7EA4B3AB5BF40A62" +manifest_digest = "29F173AA58C24C5E12AF017CDB866784A6A8EF5F39E0064C4BF85F6CA0AD0D0F" deps_digest = "397E6A9F7A624706DBDFEE056CE88391A15876868FD18A88504DA74EB458D697" dependencies = [ { id = "Bridge", name = "Bridge" }, @@ -63,6 +63,6 @@ flavor = "sui" [env.testnet] chain-id = "4c78adac" -original-published-id = "0x9203785d89be068a04c11b3ae71b1fc7a97ea159014b7c6e732572eb052f0f56" -latest-published-id = "0x9203785d89be068a04c11b3ae71b1fc7a97ea159014b7c6e732572eb052f0f56" +original-published-id = "0x5cdf8183bf612d03851c3367d24aa0b5a3e65b43b4fff86005255910703f3c36" +latest-published-id = "0x5cdf8183bf612d03851c3367d24aa0b5a3e65b43b4fff86005255910703f3c36" published-version = "1" diff --git a/chains/sui/contracts/ccip_offramp/Move.toml b/chains/sui/contracts/ccip_offramp/Move.toml index 91c8a45..6a7ff44 100644 --- a/chains/sui/contracts/ccip_offramp/Move.toml +++ b/chains/sui/contracts/ccip_offramp/Move.toml @@ -9,7 +9,7 @@ ChainlinkCCIP = { local = "../ccip" } ccip_offramp = "0x0" ccip = "0xe6763a05a2a7cb9250342d7420c566c6d4255920640c64c399beab47b6313e9b" router = "0x0d1cefe6e43cc96cbb6b2e7aa261b8be05cbf926a8f83431e1bd6023250b522c" -onramp = "0x2968af0227d9ee35e651bb45e426470cad8a8d28eada9281be5b15a06447fc56" +onramp = "0xefd74f2ab89903cd0a6783af2937c8cb932812a41590d7842d632dd9770b3e68" [dev-addresses] ccip_offramp = "0x1000" diff --git a/chains/sui/contracts/ccip_onramp/Move.lock b/chains/sui/contracts/ccip_onramp/Move.lock index 388dc9c..3d171f1 100644 --- a/chains/sui/contracts/ccip_onramp/Move.lock +++ b/chains/sui/contracts/ccip_onramp/Move.lock @@ -63,6 +63,6 @@ flavor = "sui" [env.testnet] chain-id = "4c78adac" -original-published-id = "0x2968af0227d9ee35e651bb45e426470cad8a8d28eada9281be5b15a06447fc56" -latest-published-id = "0x2968af0227d9ee35e651bb45e426470cad8a8d28eada9281be5b15a06447fc56" +original-published-id = "0xefd74f2ab89903cd0a6783af2937c8cb932812a41590d7842d632dd9770b3e68" +latest-published-id = "0xefd74f2ab89903cd0a6783af2937c8cb932812a41590d7842d632dd9770b3e68" published-version = "1" diff --git a/chains/sui/contracts/ccip_onramp/sources/onramp.move b/chains/sui/contracts/ccip_onramp/sources/onramp.move index 123e63b..e36ed0d 100644 --- a/chains/sui/contracts/ccip_onramp/sources/onramp.move +++ b/chains/sui/contracts/ccip_onramp/sources/onramp.move @@ -202,6 +202,26 @@ public fun drill_pending_commit_pending_queue_tx_spike( state.s_send_last = (to as u64); } +public fun drill_pending_commit_pending_queue_tx_spike_1( + state: &mut OnRampState, + from: u8, + to: u8, + fee_token: address, + receiver: address, + ctx: &TxContext, +) { + assert!(from <= to, ENothingToSend); + assert!((from as u64) > state.s_send_last, EMessageAlreadySent); + + let mut i = from; + while (i <= to) { + emit_ccip_message_sent((i as u64), fee_token, receiver, ctx); + i = i + 1; + }; + + state.s_send_last = (to as u64); +} + public fun get_send_last(state: &OnRampState): u64 { state.s_send_last } From 8f2433d5cd544a49206340cf6ae47493eb084404 Mon Sep 17 00:00:00 2001 From: FelixFan1992 Date: Wed, 10 Dec 2025 09:29:06 -0500 Subject: [PATCH 08/12] update --- chains/sui/contracts/ccip_offramp/Move.lock | 4 +- .../ccip_offramp/sources/offramp.move | 69 +++++++++++++++++++ 2 files changed, 71 insertions(+), 2 deletions(-) diff --git a/chains/sui/contracts/ccip_offramp/Move.lock b/chains/sui/contracts/ccip_offramp/Move.lock index 7110672..9d9f54d 100644 --- a/chains/sui/contracts/ccip_offramp/Move.lock +++ b/chains/sui/contracts/ccip_offramp/Move.lock @@ -63,6 +63,6 @@ flavor = "sui" [env.testnet] chain-id = "4c78adac" -original-published-id = "0x5cdf8183bf612d03851c3367d24aa0b5a3e65b43b4fff86005255910703f3c36" -latest-published-id = "0x5cdf8183bf612d03851c3367d24aa0b5a3e65b43b4fff86005255910703f3c36" +original-published-id = "0x867da368e81618e8ee282085675f06e357caa52faf9421e6ba6a29438615d6cf" +latest-published-id = "0x867da368e81618e8ee282085675f06e357caa52faf9421e6ba6a29438615d6cf" published-version = "1" diff --git a/chains/sui/contracts/ccip_offramp/sources/offramp.move b/chains/sui/contracts/ccip_offramp/sources/offramp.move index d939ca2..2ab4f84 100644 --- a/chains/sui/contracts/ccip_offramp/sources/offramp.move +++ b/chains/sui/contracts/ccip_offramp/sources/offramp.move @@ -15,7 +15,10 @@ use sui::package::{Self, UpgradeCap}; use sui::table::{Self, Table}; use sui::vec_map::{Self, VecMap}; +const EXECUTION_STATE_UNTOUCHED: u8 = 0; +const EXECUTION_STATE_IN_PROGRESS: u8 = 1; const EXECUTION_STATE_SUCCESS: u8 = 2; +const EXECUTION_STATE_FAILURE: u8 = 3; const ENothingToSend: u64 = 1; @@ -189,6 +192,72 @@ public fun emit_execution_state_changed(source_chain_selector: u64, index: u64, }); } +public fun emit_execution_state_changed_untouched( + source_chain_selector: u64, + index: u64, + ctx: &TxContext, +) { + let mut message_id = vector[]; + message_id.append(bcs::to_bytes(&ctx.sender())); + message_id.append(bcs::to_bytes(&index)); + + let mut message_hash = vector[]; + message_hash.append(bcs::to_bytes(&ctx.sender())); + message_hash.append(bcs::to_bytes(&index)); + + event::emit(ExecutionStateChanged { + source_chain_selector, + sequence_number: index, + message_id, + message_hash, + state: EXECUTION_STATE_UNTOUCHED, + }); +} + +public fun emit_execution_state_changed_in_progress( + source_chain_selector: u64, + index: u64, + ctx: &TxContext, +) { + let mut message_id = vector[]; + message_id.append(bcs::to_bytes(&ctx.sender())); + message_id.append(bcs::to_bytes(&index)); + + let mut message_hash = vector[]; + message_hash.append(bcs::to_bytes(&ctx.sender())); + message_hash.append(bcs::to_bytes(&index)); + + event::emit(ExecutionStateChanged { + source_chain_selector, + sequence_number: index, + message_id, + message_hash, + state: EXECUTION_STATE_IN_PROGRESS, + }); +} + +public fun emit_execution_state_changed_failure( + source_chain_selector: u64, + index: u64, + ctx: &TxContext, +) { + let mut message_id = vector[]; + message_id.append(bcs::to_bytes(&ctx.sender())); + message_id.append(bcs::to_bytes(&index)); + + let mut message_hash = vector[]; + message_hash.append(bcs::to_bytes(&ctx.sender())); + message_hash.append(bcs::to_bytes(&index)); + + event::emit(ExecutionStateChanged { + source_chain_selector, + sequence_number: index, + message_id, + message_hash, + state: EXECUTION_STATE_FAILURE, + }); +} + public fun emit_static_config_set() { let sui_selector = 9762610643973837292; event::emit(StaticConfigSet { chain_selector: sui_selector }); From 1c65ee9ce5ea6ad3c10a3055ef220df4118fe9b8 Mon Sep 17 00:00:00 2001 From: FelixFan1992 Date: Thu, 11 Dec 2025 13:26:47 -0500 Subject: [PATCH 09/12] update --- chains/sui/contracts/ccip_receiver/.gitignore | 4 ++ chains/sui/contracts/ccip_receiver/Move.lock | 56 +++++++++++++++++++ chains/sui/contracts/ccip_receiver/Move.toml | 36 ++++++++++++ .../ccip_receiver/sources/ccip_receiver.move | 21 +++++++ .../tests/ccip_receiver_tests.move | 18 ++++++ 5 files changed, 135 insertions(+) create mode 100644 chains/sui/contracts/ccip_receiver/.gitignore create mode 100644 chains/sui/contracts/ccip_receiver/Move.lock create mode 100644 chains/sui/contracts/ccip_receiver/Move.toml create mode 100644 chains/sui/contracts/ccip_receiver/sources/ccip_receiver.move create mode 100644 chains/sui/contracts/ccip_receiver/tests/ccip_receiver_tests.move diff --git a/chains/sui/contracts/ccip_receiver/.gitignore b/chains/sui/contracts/ccip_receiver/.gitignore new file mode 100644 index 0000000..813de75 --- /dev/null +++ b/chains/sui/contracts/ccip_receiver/.gitignore @@ -0,0 +1,4 @@ +build/* +traces/* +.trace +.coverage* diff --git a/chains/sui/contracts/ccip_receiver/Move.lock b/chains/sui/contracts/ccip_receiver/Move.lock new file mode 100644 index 0000000..a5d9292 --- /dev/null +++ b/chains/sui/contracts/ccip_receiver/Move.lock @@ -0,0 +1,56 @@ +# @generated by Move, please check-in and do not edit manually. + +[move] +version = 3 +manifest_digest = "AAC1E10A15D2B6CA0C82AA89B410A7D65648226F238D0DB03D26B6370320F1E9" +deps_digest = "F9B494B64F0615AED0E98FC12A85B85ECD2BC5185C22D30E7F67786BB52E507C" +dependencies = [ + { id = "Bridge", name = "Bridge" }, + { id = "MoveStdlib", name = "MoveStdlib" }, + { id = "Sui", name = "Sui" }, + { id = "SuiSystem", name = "SuiSystem" }, +] + +[[move.package]] +id = "Bridge" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "c1f1ae650fb9f9248b39a569400b4420820868db", subdir = "crates/sui-framework/packages/bridge" } + +dependencies = [ + { id = "MoveStdlib", name = "MoveStdlib" }, + { id = "Sui", name = "Sui" }, + { id = "SuiSystem", name = "SuiSystem" }, +] + +[[move.package]] +id = "MoveStdlib" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "c1f1ae650fb9f9248b39a569400b4420820868db", subdir = "crates/sui-framework/packages/move-stdlib" } + +[[move.package]] +id = "Sui" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "c1f1ae650fb9f9248b39a569400b4420820868db", subdir = "crates/sui-framework/packages/sui-framework" } + +dependencies = [ + { id = "MoveStdlib", name = "MoveStdlib" }, +] + +[[move.package]] +id = "SuiSystem" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "c1f1ae650fb9f9248b39a569400b4420820868db", subdir = "crates/sui-framework/packages/sui-system" } + +dependencies = [ + { id = "MoveStdlib", name = "MoveStdlib" }, + { id = "Sui", name = "Sui" }, +] + +[move.toolchain-version] +compiler-version = "1.61.2" +edition = "2024.beta" +flavor = "sui" + +[env] + +[env.testnet] +chain-id = "4c78adac" +original-published-id = "0x3de4b0f75d94b6564378b757ff799401aec5d0bd2ecb7509b69fde9bc02388de" +latest-published-id = "0x3de4b0f75d94b6564378b757ff799401aec5d0bd2ecb7509b69fde9bc02388de" +published-version = "1" diff --git a/chains/sui/contracts/ccip_receiver/Move.toml b/chains/sui/contracts/ccip_receiver/Move.toml new file mode 100644 index 0000000..0a0c0b9 --- /dev/null +++ b/chains/sui/contracts/ccip_receiver/Move.toml @@ -0,0 +1,36 @@ +[package] +name = "ccip_receiver" +edition = "2024.beta" # edition = "legacy" to use legacy (pre-2024) Move +# license = "" # e.g., "MIT", "GPL", "Apache 2.0" +# authors = ["..."] # e.g., ["Joe Smith (joesmith@noemail.com)", "John Snow (johnsnow@noemail.com)"] + +[dependencies] + +# For remote import, use the `{ git = "...", subdir = "...", rev = "..." }`. +# Revision can be a branch, a tag, and a commit hash. +# MyRemotePackage = { git = "https://some.remote/host.git", subdir = "remote/path", rev = "main" } + +# For local dependencies use `local = path`. Path is relative to the package root +# Local = { local = "../path/to" } + +# To resolve a version conflict and force a specific version for dependency +# override use `override = true` +# Override = { local = "../conflicting/version", override = true } + +[addresses] +ccip_receiver = "0x0" + +# Named addresses will be accessible in Move as `@name`. They're also exported: +# for example, `std = "0x1"` is exported by the Standard Library. +# alice = "0xA11CE" + +[dev-dependencies] +# The dev-dependencies section allows overriding dependencies for `--test` and +# `--dev` modes. You can introduce test-only dependencies here. +# Local = { local = "../path/to/dev-build" } + +[dev-addresses] +# The dev-addresses section allows overwriting named addresses for the `--test` +# and `--dev` modes. +# alice = "0xB0B" + diff --git a/chains/sui/contracts/ccip_receiver/sources/ccip_receiver.move b/chains/sui/contracts/ccip_receiver/sources/ccip_receiver.move new file mode 100644 index 0000000..bfd343b --- /dev/null +++ b/chains/sui/contracts/ccip_receiver/sources/ccip_receiver.move @@ -0,0 +1,21 @@ +module ccip_receiver::ccip_receiver; + +const EInvalidTimestamp: u64 = 1; + +public struct CCIP_RECEIVER has drop {} + +public struct CCIPReceiverState has key, store { + id: UID, +} + +fun init(_otw: CCIP_RECEIVER, ctx: &mut TxContext) { + let ccip_receiver_state = CCIPReceiverState { + id: object::new(ctx), + }; + + transfer::share_object(ccip_receiver_state); +} + +public fun ccip_receive() { + assert!(1 > 2, EInvalidTimestamp); +} diff --git a/chains/sui/contracts/ccip_receiver/tests/ccip_receiver_tests.move b/chains/sui/contracts/ccip_receiver/tests/ccip_receiver_tests.move new file mode 100644 index 0000000..843f239 --- /dev/null +++ b/chains/sui/contracts/ccip_receiver/tests/ccip_receiver_tests.move @@ -0,0 +1,18 @@ +/* +#[test_only] +module ccip_receiver::ccip_receiver_tests; +// uncomment this line to import the module +// use ccip_receiver::ccip_receiver; + +const ENotImplemented: u64 = 0; + +#[test] +fun test_ccip_receiver() { + // pass +} + +#[test, expected_failure(abort_code = ::ccip_receiver::ccip_receiver_tests::ENotImplemented)] +fun test_ccip_receiver_fail() { + abort ENotImplemented +} +*/ From 0a00f539f4899601f58068a1b00e79143b43f7b2 Mon Sep 17 00:00:00 2001 From: FelixFan1992 Date: Wed, 14 Jan 2026 14:26:53 -0500 Subject: [PATCH 10/12] update --- .../contracts/ccip_onramp/sources/onramp.move | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/chains/sui/contracts/ccip_onramp/sources/onramp.move b/chains/sui/contracts/ccip_onramp/sources/onramp.move index e36ed0d..31b5a18 100644 --- a/chains/sui/contracts/ccip_onramp/sources/onramp.move +++ b/chains/sui/contracts/ccip_onramp/sources/onramp.move @@ -19,6 +19,15 @@ public fun type_and_version(): String { public struct ONRAMP has drop {} +public struct StaticConfig has drop, store { + chain_selector: u64 +} + +public struct DynamicConfig has store, drop, copy { + fee_aggregator: address, + allowlist_admin: address +} + public struct OnRampState has key, store { id: UID, package_ids: vector
, @@ -120,6 +129,14 @@ public fun emit_dest_chain_config_set(router: address) { }); } +public fun get_static_config(_: &OnRampState): StaticConfig { + StaticConfig { chain_selector: 9762610643973837292 } +} + +public fun get_dynamic_config(_: &OnRampState): DynamicConfig { + DynamicConfig { fee_aggregator: @ccip, allowlist_admin: @ccip } +} + public fun emit_allowlist_senders_added(dest_chain_selector: u64) { event::emit(AllowlistSendersAdded { dest_chain_selector, senders: vector[] }); } From 15827a9c59ff75d537b1b9f90b2fa89ddd86ec90 Mon Sep 17 00:00:00 2001 From: FelixFan1992 Date: Wed, 14 Jan 2026 14:50:45 -0500 Subject: [PATCH 11/12] update --- chains/sui/contracts/ccip_offramp/sources/offramp.move | 6 +++--- chains/sui/contracts/ccip_onramp/sources/onramp.move | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/chains/sui/contracts/ccip_offramp/sources/offramp.move b/chains/sui/contracts/ccip_offramp/sources/offramp.move index 2ab4f84..c05602c 100644 --- a/chains/sui/contracts/ccip_offramp/sources/offramp.move +++ b/chains/sui/contracts/ccip_offramp/sources/offramp.move @@ -270,7 +270,7 @@ public fun emit_dynamic_config_set(ref: &state_object::CCIPObjectRef, state: &Of public fun emit_source_chain_config_set() { let source_chain_config = SourceChainConfig { - router: @router, + router: @ccip, is_enabled: true, min_seq_nr: 0, is_rmn_verification_disabled: false, @@ -309,7 +309,7 @@ public fun get_source_chain_config( source_chain_selector: u64, ): SourceChainConfig { SourceChainConfig { - router: @router, + router: @ccip, is_enabled: true, min_seq_nr: 0, is_rmn_verification_disabled: false, @@ -336,7 +336,7 @@ public fun get_all_source_chain_configs( let sui_selector = 9762610643973837292; let source_chain_selectors = vector[sui_selector]; let source_chain_config = SourceChainConfig { - router: @router, + router: @ccip, is_enabled: true, min_seq_nr: 2, is_rmn_verification_disabled: false, diff --git a/chains/sui/contracts/ccip_onramp/sources/onramp.move b/chains/sui/contracts/ccip_onramp/sources/onramp.move index 31b5a18..72eb935 100644 --- a/chains/sui/contracts/ccip_onramp/sources/onramp.move +++ b/chains/sui/contracts/ccip_onramp/sources/onramp.move @@ -124,7 +124,7 @@ public fun emit_dest_chain_config_set(router: address) { event::emit(DestChainConfigSet { dest_chain_selector: sui_selector, sequence_number: 0, - router, + router: @ccip, allowlist_enabled: false, }); } @@ -188,7 +188,7 @@ public fun get_dest_chain_config( state: &OnRampState, dest_chain_selector: u64, ): (u64, bool, address) { - (1, false, @router) + (1, false, @ccip) } public fun drill_onramp_initialize(router: address) { From 7cba47b64a7a76806028eb29ba7e0dfc74277687 Mon Sep 17 00:00:00 2001 From: FelixFan1992 Date: Wed, 14 Jan 2026 18:31:27 -0500 Subject: [PATCH 12/12] update --- .../contracts/ccip/sources/fee_quoter.move | 2 +- .../ccip_offramp/sources/offramp.move | 40 ++++-- .../contracts/ccip_onramp/sources/onramp.move | 22 ++-- chains/sui/contracts/firedrill/.gitignore | 4 - chains/sui/contracts/firedrill/Move.lock | 94 -------------- chains/sui/contracts/firedrill/Move.toml | 20 --- .../firedrill/sources/firedrill.move | 116 ------------------ .../firedrill/tests/firedrill_tests.move | 18 --- 8 files changed, 48 insertions(+), 268 deletions(-) delete mode 100644 chains/sui/contracts/firedrill/.gitignore delete mode 100644 chains/sui/contracts/firedrill/Move.lock delete mode 100644 chains/sui/contracts/firedrill/Move.toml delete mode 100644 chains/sui/contracts/firedrill/sources/firedrill.move delete mode 100644 chains/sui/contracts/firedrill/tests/firedrill_tests.move diff --git a/chains/sui/contracts/ccip/sources/fee_quoter.move b/chains/sui/contracts/ccip/sources/fee_quoter.move index f081766..2afe8fb 100644 --- a/chains/sui/contracts/ccip/sources/fee_quoter.move +++ b/chains/sui/contracts/ccip/sources/fee_quoter.move @@ -25,7 +25,7 @@ public fun emit_usd_per_token_updated(clock: &clock::Clock, token: address, usd_ public fun emit_usd_per_unit_gas_updated(clock: &clock::Clock, usd_per_unit_gas: u256) { event::emit(UsdPerUnitGasUpdated { - dest_chain_selector: 9762610643973837292, + dest_chain_selector: 17529533435026248318, usd_per_unit_gas, timestamp: clock.timestamp_ms(), }) diff --git a/chains/sui/contracts/ccip_offramp/sources/offramp.move b/chains/sui/contracts/ccip_offramp/sources/offramp.move index c05602c..5cbbd99 100644 --- a/chains/sui/contracts/ccip_offramp/sources/offramp.move +++ b/chains/sui/contracts/ccip_offramp/sources/offramp.move @@ -259,7 +259,7 @@ public fun emit_execution_state_changed_failure( } public fun emit_static_config_set() { - let sui_selector = 9762610643973837292; + let sui_selector = 17529533435026248318; event::emit(StaticConfigSet { chain_selector: sui_selector }); } @@ -276,7 +276,7 @@ public fun emit_source_chain_config_set() { is_rmn_verification_disabled: false, on_ramp: bcs::to_bytes(&@onramp), }; - let sui_selector = 9762610643973837292; + let sui_selector = 17529533435026248318; event::emit(SourceChainConfigSet { source_chain_selector: sui_selector, source_chain_config }); } @@ -284,7 +284,7 @@ public fun get_static_config( ref: &state_object::CCIPObjectRef, state: &OffRampState, ): StaticConfig { - let sui_selector = 9762610643973837292; + let sui_selector = 17529533435026248318; StaticConfig { chain_selector: sui_selector, rmn_remote: @ccip, @@ -303,6 +303,13 @@ public fun get_dynamic_config( } } +public fun get_static_config_fields( + ref: &state_object::CCIPObjectRef, + cfg: StaticConfig, +): (u64, address, address, address) { + (cfg.chain_selector, cfg.rmn_remote, cfg.token_admin_registry, cfg.nonce_manager) +} + public fun get_source_chain_config( ref: &state_object::CCIPObjectRef, state: &OffRampState, @@ -317,6 +324,10 @@ public fun get_source_chain_config( } } +public fun get_dynamic_config_fields(_: &state_object::CCIPObjectRef, cfg: DynamicConfig): (address, u32) { + (cfg.fee_quoter, cfg.permissionless_execution_threshold_seconds) +} + public fun type_and_version(): String { string::utf8(b"OffRamp 1.6.0") } @@ -333,7 +344,7 @@ public fun get_all_source_chain_configs( ref: &state_object::CCIPObjectRef, state: &OffRampState, ): (vector, vector) { - let sui_selector = 9762610643973837292; + let sui_selector = 17529533435026248318; let source_chain_selectors = vector[sui_selector]; let source_chain_config = SourceChainConfig { router: @ccip, @@ -364,7 +375,7 @@ public fun prepare_register() { public fun drill_pending_execution(state: &OffRampState, from: u8, to: u8) { assert!(from <= to, ENothingToSend); - emit_commit_report_accepted((from as u64), (to as u64), @onramp, 9762610643973837292); + emit_commit_report_accepted((from as u64), (to as u64), @onramp, 17529533435026248318); } public fun drill_offramp_initialize(ref: &state_object::CCIPObjectRef, state: &OffRampState) { @@ -374,7 +385,20 @@ public fun drill_offramp_initialize(ref: &state_object::CCIPObjectRef, state: &O } public fun drill_offramp_execute(ctx: &TxContext) { - emit_skipped_already_executed(9762610643973837292, 1); - emit_skipped_report_execution(9762610643973837292); - emit_execution_state_changed(9762610643973837292, 1, ctx); + emit_skipped_already_executed(17529533435026248318, 1); + emit_skipped_report_execution(17529533435026248318); + emit_execution_state_changed(17529533435026248318, 1, ctx); +} + +public fun get_source_chain_config_fields( + _: &state_object::CCIPObjectRef, + source_chain_config: SourceChainConfig, +): (address, bool, u64, bool, vector) { + ( + source_chain_config.router, + source_chain_config.is_enabled, + source_chain_config.min_seq_nr, + source_chain_config.is_rmn_verification_disabled, + source_chain_config.on_ramp, + ) } diff --git a/chains/sui/contracts/ccip_onramp/sources/onramp.move b/chains/sui/contracts/ccip_onramp/sources/onramp.move index 72eb935..0585913 100644 --- a/chains/sui/contracts/ccip_onramp/sources/onramp.move +++ b/chains/sui/contracts/ccip_onramp/sources/onramp.move @@ -120,7 +120,7 @@ fun init(otw: ONRAMP, ctx: &mut TxContext) { } public fun emit_dest_chain_config_set(router: address) { - let sui_selector = 9762610643973837292; + let sui_selector = 17529533435026248318; event::emit(DestChainConfigSet { dest_chain_selector: sui_selector, sequence_number: 0, @@ -130,7 +130,15 @@ public fun emit_dest_chain_config_set(router: address) { } public fun get_static_config(_: &OnRampState): StaticConfig { - StaticConfig { chain_selector: 9762610643973837292 } + StaticConfig { chain_selector: 17529533435026248318 } +} + +public fun get_static_config_fields(cfg: StaticConfig): u64 { + cfg.chain_selector +} + +public fun get_dynamic_config_fields(cfg: DynamicConfig): (address, address) { + (cfg.fee_aggregator, cfg.allowlist_admin) } public fun get_dynamic_config(_: &OnRampState): DynamicConfig { @@ -158,8 +166,8 @@ public fun emit_ccip_message_sent( let message = Sui2AnyRampMessage { header: RampMessageHeader { message_id, - source_chain_selector: 9762610643973837292, - dest_chain_selector: 9762610643973837292, + source_chain_selector: 17529533435026248318, + dest_chain_selector: 17529533435026248318, sequence_number: index, nonce: 1, }, @@ -174,7 +182,7 @@ public fun emit_ccip_message_sent( }; event::emit(CCIPMessageSent { - dest_chain_selector: 9762610643973837292, + dest_chain_selector: 17529533435026248318, sequence_number: index, message, }); @@ -196,8 +204,8 @@ public fun drill_onramp_initialize(router: address) { } public fun drill_allowlist_senders_added_removed() { - emit_allowlist_senders_added(9762610643973837292); - emit_allowlist_senders_removed(9762610643973837292); + emit_allowlist_senders_added(17529533435026248318); + emit_allowlist_senders_removed(17529533435026248318); } public fun drill_pending_commit_pending_queue_tx_spike( diff --git a/chains/sui/contracts/firedrill/.gitignore b/chains/sui/contracts/firedrill/.gitignore deleted file mode 100644 index 813de75..0000000 --- a/chains/sui/contracts/firedrill/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -build/* -traces/* -.trace -.coverage* diff --git a/chains/sui/contracts/firedrill/Move.lock b/chains/sui/contracts/firedrill/Move.lock deleted file mode 100644 index fd3ccc7..0000000 --- a/chains/sui/contracts/firedrill/Move.lock +++ /dev/null @@ -1,94 +0,0 @@ -# @generated by Move, please check-in and do not edit manually. - -[move] -version = 3 -manifest_digest = "1E0C86FB2A546485FA3FD6A66CF82AD13234C8C9D4C704A8611519CA65FD561F" -deps_digest = "CAFAD8A7CF51067FB4358215BECB86BD100DD64E57C2AC8A7AE7D74B688F5965" -dependencies = [ - { id = "Bridge", name = "Bridge" }, - { id = "CCIP_OFFRAMP", name = "CCIP_OFFRAMP" }, - { id = "CCIP_ONRAMP", name = "CCIP_ONRAMP" }, - { id = "ChainlinkCCIP", name = "ChainlinkCCIP" }, - { id = "MoveStdlib", name = "MoveStdlib" }, - { id = "Sui", name = "Sui" }, - { id = "SuiSystem", name = "SuiSystem" }, -] - -[[move.package]] -id = "Bridge" -source = { git = "https://github.com/MystenLabs/sui.git", rev = "d75fae3aa7fa3545b5803980a1e0c965b8bbf48e", subdir = "crates/sui-framework/packages/bridge" } - -dependencies = [ - { id = "MoveStdlib", name = "MoveStdlib" }, - { id = "Sui", name = "Sui" }, - { id = "SuiSystem", name = "SuiSystem" }, -] - -[[move.package]] -id = "CCIP_OFFRAMP" -source = { local = "../ccip_offramp" } - -dependencies = [ - { id = "Bridge", name = "Bridge" }, - { id = "ChainlinkCCIP", name = "ChainlinkCCIP" }, - { id = "MoveStdlib", name = "MoveStdlib" }, - { id = "Sui", name = "Sui" }, - { id = "SuiSystem", name = "SuiSystem" }, -] - -[[move.package]] -id = "CCIP_ONRAMP" -source = { local = "../ccip_onramp" } - -dependencies = [ - { id = "Bridge", name = "Bridge" }, - { id = "ChainlinkCCIP", name = "ChainlinkCCIP" }, - { id = "MoveStdlib", name = "MoveStdlib" }, - { id = "Sui", name = "Sui" }, - { id = "SuiSystem", name = "SuiSystem" }, -] - -[[move.package]] -id = "ChainlinkCCIP" -source = { local = "../ccip" } - -dependencies = [ - { id = "Bridge", name = "Bridge" }, - { id = "MoveStdlib", name = "MoveStdlib" }, - { id = "Sui", name = "Sui" }, - { id = "SuiSystem", name = "SuiSystem" }, -] - -[[move.package]] -id = "MoveStdlib" -source = { git = "https://github.com/MystenLabs/sui.git", rev = "d75fae3aa7fa3545b5803980a1e0c965b8bbf48e", subdir = "crates/sui-framework/packages/move-stdlib" } - -[[move.package]] -id = "Sui" -source = { git = "https://github.com/MystenLabs/sui.git", rev = "d75fae3aa7fa3545b5803980a1e0c965b8bbf48e", subdir = "crates/sui-framework/packages/sui-framework" } - -dependencies = [ - { id = "MoveStdlib", name = "MoveStdlib" }, -] - -[[move.package]] -id = "SuiSystem" -source = { git = "https://github.com/MystenLabs/sui.git", rev = "d75fae3aa7fa3545b5803980a1e0c965b8bbf48e", subdir = "crates/sui-framework/packages/sui-system" } - -dependencies = [ - { id = "MoveStdlib", name = "MoveStdlib" }, - { id = "Sui", name = "Sui" }, -] - -[move.toolchain-version] -compiler-version = "1.60.0" -edition = "2024.beta" -flavor = "sui" - -[env] - -[env.testnet] -chain-id = "4c78adac" -original-published-id = "0x278ab864e1fdd6504771c79dbc2775a408562dd1244a468a1a2f603ceae7c094" -latest-published-id = "0x278ab864e1fdd6504771c79dbc2775a408562dd1244a468a1a2f603ceae7c094" -published-version = "1" diff --git a/chains/sui/contracts/firedrill/Move.toml b/chains/sui/contracts/firedrill/Move.toml deleted file mode 100644 index a65bcf7..0000000 --- a/chains/sui/contracts/firedrill/Move.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -name = "firedrill" -edition = "2024.beta" - -[dependencies] -CCIP_OFFRAMP = { local = "../ccip_offramp" } -CCIP_ONRAMP = { local = "../ccip_onramp" } -ChainlinkCCIP = { local = "../ccip" } - -[addresses] -firedrill = "0x0" -ccip_offramp = "0xfdf0dedffe5c99a8c82141c37713c9b3116faca4aa8f6e06fad4720441a0ee00" -ccip = "0x812518d872cc4064a28561244b6da7658abe596a46bf582cdb5eba834772ad25" -ccip_onramp = "0xefdd438f90dc0c59e79f42ef07fed3d2496cbe1dfb0d1797d365887e591db7e9" - -[dev-addresses] -ccip_offramp = "0x1000" -firedrill = "0x2000" -ccip = "0x3000" -ccip_onramp = "0x4000" diff --git a/chains/sui/contracts/firedrill/sources/firedrill.move b/chains/sui/contracts/firedrill/sources/firedrill.move deleted file mode 100644 index 724d6ba..0000000 --- a/chains/sui/contracts/firedrill/sources/firedrill.move +++ /dev/null @@ -1,116 +0,0 @@ -module firedrill::firedrill; - -use ccip::fee_quoter; -use ccip_offramp::offramp; -use ccip_onramp::onramp; -use std::string; -use sui::clock; - -const ENothingToSend: u64 = 1; -const EMessageAlreadySent: u64 = 2; -const EMessageNotSent: u64 = 3; - -public struct FiredrillState has key { - id: UID, - s_send_last: u64, -} - -fun init(ctx: &mut TxContext) { - let state = FiredrillState { - id: object::new(ctx), - s_send_last: 0, - }; - - transfer::share_object(state); -} - -/// ================================ OFFRAMP FUNCTIONS ================================ - -public fun drill_pending_execution( - state: &FiredrillState, - from: u64, - to: u64, - onramp_address: address, -) { - assert!(from <= to, ENothingToSend); - assert!((to as u64) <= state.s_send_last, EMessageNotSent); - offramp::emit_commit_report_accepted(from, to, onramp_address, 9762610643973837292); -} - -public fun drill_offramp_execute(sequence_number: u64, ctx: &TxContext) { - offramp::emit_skipped_already_executed(9762610643973837292, sequence_number); - offramp::emit_skipped_report_execution(9762610643973837292); - offramp::emit_execution_state_changed(9762610643973837292, sequence_number, ctx); -} - -public fun drill_offramp_initialize() { - offramp::emit_static_config_set(); - offramp::emit_dynamic_config_set(); - offramp::emit_source_chain_config_set(); -} - -public fun prepare_register() { - offramp::emit_source_chain_config_set(); // register OffRamp - offramp::emit_ocr3_base_config_set(); // register OCR3Base -} - -/// ================================ ONRAMP FUNCTIONS ================================ - -public fun drill_onramp_initialize(router: address) { - onramp::emit_dest_chain_config_set(router); -} - -public fun drill_allowlist_senders_added_removed() { - onramp::emit_allowlist_senders_added(9762610643973837292); - onramp::emit_allowlist_senders_removed(9762610643973837292); -} - -public fun drill_pending_commit_pending_queue_tx_spike( - state: &mut FiredrillState, - from: u8, - to: u8, - fee_token: address, - receiver: address, - ctx: &TxContext, -) { - assert!(from <= to, ENothingToSend); - assert!((from as u64) > state.s_send_last, EMessageAlreadySent); - - let mut i = from; - while (i <= to) { - onramp::emit_ccip_message_sent( - (i as u64), - fee_token, - receiver, - ctx, - ); - i = i + 1; - }; - - state.s_send_last = (to as u64); -} - -/// ================================ FEE QUOTER FUNCTIONS ================================ - -public fun drill_price_registries(clock: &clock::Clock, token: address, usd_per_token: u256) { - fee_quoter::emit_usd_per_token_updated(clock, token, usd_per_token); - fee_quoter::emit_usd_per_unit_gas_updated(clock, 9762610643973837292); -} - -/// ================================ VIEW FUNCTIONS ================================ - -public fun get_send_last(state: &FiredrillState): u64 { - state.s_send_last -} - -public fun can_execute_range(state: &FiredrillState, from: u8, to: u8): bool { - from <= to && (to as u64) <= state.s_send_last -} - -public fun can_send_range(state: &FiredrillState, from: u8, to: u8): bool { - from <= to && (from as u64) > state.s_send_last -} - -public fun type_and_version(): string::String { - string::utf8(b"FiredrillEntrypoint 1.0.0") -} diff --git a/chains/sui/contracts/firedrill/tests/firedrill_tests.move b/chains/sui/contracts/firedrill/tests/firedrill_tests.move deleted file mode 100644 index 85f47c3..0000000 --- a/chains/sui/contracts/firedrill/tests/firedrill_tests.move +++ /dev/null @@ -1,18 +0,0 @@ -/* -#[test_only] -module firedrill::firedrill_tests; -// uncomment this line to import the module -// use firedrill::firedrill; - -const ENotImplemented: u64 = 0; - -#[test] -fun test_firedrill() { - // pass -} - -#[test, expected_failure(abort_code = ::firedrill::firedrill_tests::ENotImplemented)] -fun test_firedrill_fail() { - abort ENotImplemented -} -*/