You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(bridge): cross-chain ROSE bridge with modular Accounting proxy
Add a trustless cross-chain ROSE bridge between Oasis Sapphire and EVM
chains, and restructure the Accounting contract into delegated modules
behind its UUPS proxy.
Bridge:
- Lock/mint and burn/release flows for native ROSE <-> xERC20 xROSE,
authorized by EIP-712 BridgeWithdraw signatures and settled by the
ROFL TEE.
- Vendored xERC20 (defi-wonderland) with provenance README; CREATE3
deployment of xROSE and ROFLBridge on the destination chain.
- Config-driven chain ids, gas pricing, and route registration via a
generic addBridgeAssetToken task; deposit verification reuses the
existing receipt/proof path.
Accounting modularization:
- Extract history into a delegated AccountingHistoryModule and the lock
subsystem into a delegated LockModule; lift shared history and
withdrawal internals into AccountingStorage.
- Wire both modules through the upgrade task and harden custody and
bridge-out fund safety.
Custody-tx executor:
- Durable per-chain queue for every tx signed by Accounting.evmAddress(),
with auto-recovery for stuck transactions and an owner-authorized
clear surface.
- Skip non-record sidecar files in the state-dir scan so the executor
no longer aborts startup on the clear-watcher cursor.
Ops:
- Serve the API via the ROFL auto proxy hostname, record the fresh
bridge deployment addresses, and ship the container image at v31.
Verified end-to-end on testnet: Sapphire ROSE -> Base xROSE and back,
with steady-state value conservation.
Copy file name to clipboardExpand all lines: Makefile
+10-1Lines changed: 10 additions & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -1,4 +1,4 @@
1
-
.PHONY: install dev run test lint typecheck clean solidity solidity-build solidity-test solidity-lib solidity-clean solidity-coverage format format-check openapi openapi-check
1
+
.PHONY: install dev run test lint typecheck clean solidity solidity-build solidity-test solidity-ci solidity-lib solidity-clean solidity-coverage format format-check openapi openapi-check
2
2
3
3
install:
4
4
uv sync --no-dev
@@ -50,6 +50,15 @@ solidity-build:
50
50
solidity-test:
51
51
cd solidity && bun run test
52
52
53
+
# Mirrors the solidity job in .github/workflows/ci.yml: clean compile,
54
+
# size gate, upgrade-safety, targeted storage-layout pre-flight, full suite.
55
+
# Run before pushing if you want CI-equivalent verification locally.
56
+
solidity-ci: solidity-clean solidity-build
57
+
cd solidity && bun run check:size
58
+
cd solidity && npx hardhat run scripts/validate-upgrade.ts
59
+
cd solidity && bun run test -- --bail --grep "storage|fallback dispatcher|setBridgeModule|signer isolation"
60
+
cd solidity && bun run test
61
+
53
62
solidity-clean:
54
63
cd solidity && rm -rf dist artifacts cache typechain-types ignition/deployments
Copy file name to clipboardExpand all lines: docs/api-reference.md
+7-5Lines changed: 7 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -97,13 +97,15 @@ POST /auth/token {grant_type=authorization_code, code, code_verifier, …}
97
97
98
98
| Field | Description | History kind type(s) |
99
99
| --- | --- | --- |
100
-
|`kind`| Entry type. Known values are `deposit`, `withdraw`, `createLock`, `transferFromLock`, and `transferBalance`; undecoded entries return `unknown`. | all |
100
+
|`kind`| Entry type. Known values are `deposit`, `withdraw`, `createLock`, `transferFromLock`, `transferBalance`, `modifyLock`, and `unlockLock`; undecoded entries return `unknown`. | all |
|`amount`| Token amount as a decimal string. For `modifyLock`, this is the additional locked amount and can be `0` for expiry-only changes. For `unlockLock`, this is the amount returned to available balance. |`deposit`, `withdraw`, `createLock`, `transferFromLock`, `transferBalance`, `modifyLock`, `unlockLock`|
104
+
|`chain_id`| Source chain for `token_id`, when known. |`deposit`, `withdraw`, `createLock`, `transferFromLock`, `transferBalance`, `modifyLock`, `unlockLock`|
105
105
|`deposit_id`| Deposit identifier. |`deposit`|
106
-
|`counterparty`| Address payload for non-deposit entries: withdrawal destination, lock service, or transfer recipient. |`withdraw`, `createLock`, `transferFromLock`, `transferBalance`|
106
+
|`counterparty`| Address payload for non-deposit entries: withdrawal destination for `withdraw`, lock service for `createLock`/`modifyLock`/`unlockLock`, and the other side relative to the authenticated user for paired internal transfer rows. |`withdraw`, `createLock`, `transferFromLock`, `transferBalance`, `modifyLock`, `unlockLock`|
107
+
|`from_address`| Sender/original user for paired internal transfer rows. |`transferFromLock`, `transferBalance`|
108
+
|`to_address`| Recipient user for paired internal transfer rows. |`transferFromLock`, `transferBalance`|
0 commit comments