Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
270 commits
Select commit Hold shift + click to select a range
cf4e385
docs: say where a priced deposit's cash is
hpmaxi Oct 17, 2026
4136251
feat(vault): reconcile an epoch once it settles
hpmaxi Oct 17, 2026
e541600
test(vault): pin why wind-down dust stays owed
hpmaxi Oct 17, 2026
a966d6d
docs: describe epoch settlement
hpmaxi Oct 17, 2026
8f3a6c3
fix(vault): address settlement review round 1
hpmaxi Oct 17, 2026
4721abe
fix(vault): correct refused-mint settlement wording
hpmaxi Oct 17, 2026
7dca4e5
fix(vault): reopen cancellation while paused
hpmaxi Oct 17, 2026
5326531
docs: write down the cancel window rules
hpmaxi Oct 17, 2026
68527ee
feat(vault): send a delisted claim to the queue
hpmaxi Oct 17, 2026
d435890
fix(vault): burn unpaid escrow during a wind-down
hpmaxi Oct 17, 2026
338748a
docs: describe the delisted exit path
hpmaxi Oct 17, 2026
7cdc0cc
fix(vault): address delisted exit review round 1
hpmaxi Oct 17, 2026
e746950
feat(vault): hold a frozen holder's exits
hpmaxi Oct 17, 2026
592b44b
fix(vault): address freeze review round 1
hpmaxi Oct 17, 2026
bd627a7
feat(token): timelock admin changes after setup
hpmaxi Oct 17, 2026
71fa5cc
test(token): upgrade wasm under live balances
hpmaxi Oct 17, 2026
363edc8
feat(harness): finish the token's setup on deploy
hpmaxi Oct 17, 2026
2bf3944
docs: put the token's admin behind the timelock
hpmaxi Oct 17, 2026
5c79f22
fix(token): address timelock review round 1
hpmaxi Oct 17, 2026
5a716aa
feat(oracle): timelock config and admin changes
hpmaxi Oct 17, 2026
83b6ac4
feat(harness): finish the oracle's setup on deploy
hpmaxi Oct 17, 2026
793592d
docs: put the oracle's admin behind the timelock
hpmaxi Oct 17, 2026
84a3185
fix(oracle): address timelock review round 1
hpmaxi Oct 17, 2026
fbeb012
feat(vault): timelock governance after setup
hpmaxi Oct 17, 2026
f095d65
docs: put the vault's admin behind the timelock
hpmaxi Oct 17, 2026
cbf5c36
fix(vault): address setup review round 1
hpmaxi Oct 17, 2026
6357e41
feat(vault): swap the oracle through the timelock
hpmaxi Oct 17, 2026
cc0f64e
feat(vault): report wiring and feed health
hpmaxi Oct 17, 2026
91e1157
fix(vault): never trap on a misbehaving token in wiring checks
hpmaxi Oct 17, 2026
49f2c01
test(harness): wind down a throwaway vault
hpmaxi Oct 17, 2026
37b050a
fix(harness): assert payout, require vault wasm
hpmaxi Oct 17, 2026
9369229
feat(token): co-sign legal transfers
hpmaxi Oct 17, 2026
c29ea4f
feat(vault): refuse setup with a frozen address
hpmaxi Oct 17, 2026
30d1abb
docs: describe the co-signed legal transfer
hpmaxi Oct 17, 2026
255cb4c
fix(token): address legal transfer review round 1
hpmaxi Oct 17, 2026
86c8669
feat(compliance): timelock rule changes
hpmaxi Oct 17, 2026
78cfda3
docs: put compliance rules behind the timelock
hpmaxi Oct 17, 2026
89c3f7d
fix(compliance): address timelock review round 1
hpmaxi Oct 17, 2026
4db73e1
fix(vault): return escrow as manager after a check
hpmaxi Oct 17, 2026
a058425
test: make admin and upgrade checks able to fail
hpmaxi Oct 17, 2026
6735839
test(harness): assert every wind-down outcome
hpmaxi Oct 17, 2026
c0dac1a
test(vault): use DAY_DURATION for day constants
hpmaxi Oct 17, 2026
1704bcf
refactor(vault): check standing before rules
hpmaxi Oct 17, 2026
a011edd
docs: correct what the review found
hpmaxi Oct 17, 2026
08689a2
docs: fix the last review sentences
hpmaxi Oct 17, 2026
2aa5213
Merge branch 'main' into feat/shared-timelock-crate
hpmaxi Oct 19, 2026
b627c53
Merge branch 'feat/instance-ttl' into docs/ttl-policy
hpmaxi Oct 19, 2026
9f7fbac
Merge branch 'feat/shared-timelock-crate' into feat/instance-ttl
hpmaxi Oct 19, 2026
0ad7ea0
Merge branch 'docs/ttl-policy' into refactor/nav-pause
hpmaxi Oct 19, 2026
ee80075
Merge branch 'refactor/nav-pause' into feat/oracle-bounds
hpmaxi Oct 19, 2026
511d7b2
Merge branch 'feat/oracle-bounds' into feat/contract-traits
hpmaxi Oct 19, 2026
37b757f
Merge branch 'feat/contract-traits' into feat/request-allowlist
hpmaxi Oct 19, 2026
e5a7a5a
Merge branch 'feat/request-allowlist' into feat/settlement-dust
hpmaxi Oct 19, 2026
ddbc63c
Merge branch 'feat/settlement-dust' into feat/cancel-window
hpmaxi Oct 19, 2026
0442a9b
Merge branch 'feat/cancel-window' into feat/delisted-exit
hpmaxi Oct 19, 2026
431115c
Merge branch 'feat/delisted-exit' into feat/171-freeze-holds
hpmaxi Oct 19, 2026
ea9bd13
Merge branch 'feat/171-freeze-holds' into feat/token-timelock
hpmaxi Oct 19, 2026
d5ec11f
Merge branch 'feat/token-timelock' into feat/oracle-timelock
hpmaxi Oct 19, 2026
d4388b4
Merge branch 'feat/oracle-timelock' into feat/vault-setup
hpmaxi Oct 19, 2026
70a1c13
Merge branch 'feat/vault-setup' into feat/oracle-swap
hpmaxi Oct 19, 2026
9022ed5
Merge branch 'feat/oracle-swap' into feat/vault-health
hpmaxi Oct 19, 2026
3586710
Merge branch 'feat/vault-health' into test/harness-wind-down
hpmaxi Oct 19, 2026
643872b
Merge branch 'test/harness-wind-down' into feat/legal-transfer
hpmaxi Oct 19, 2026
e6ccd41
Merge branch 'feat/legal-transfer' into feat/compliance-timelock
hpmaxi Oct 19, 2026
e355693
Merge branch 'feat/compliance-timelock' into fix/share-returns
hpmaxi Oct 19, 2026
25b54ab
Merge branch 'fix/share-returns' into fix/group-a-review
hpmaxi Oct 19, 2026
037d896
refactor: prefix the shared crates with strata
hpmaxi Oct 19, 2026
8aafbfa
build: pin proptest exactly
hpmaxi Oct 19, 2026
9805b51
refactor: name acting addresses caller and holder
hpmaxi Oct 19, 2026
988fd66
docs: write the code conventions in AGENTS.md
hpmaxi Oct 19, 2026
5e97dc1
refactor: name event fields and helpers the same way
hpmaxi Oct 19, 2026
c5f4448
refactor: check the vault's remaining totals
hpmaxi Oct 19, 2026
76b221f
refactor: name the vault's preconditions as guards
hpmaxi Oct 19, 2026
78d849b
refactor: name the token's preconditions as guards
hpmaxi Oct 19, 2026
714c96b
refactor: name the oracle's missing config error
hpmaxi Oct 19, 2026
b903602
refactor: name oracle preconditions as guards
hpmaxi Oct 19, 2026
7bf0774
test: name the vault tests after the holder
hpmaxi Oct 19, 2026
f516dd3
refactor: name compliance preconditions as guards
hpmaxi Oct 19, 2026
5c25047
refactor: fail loudly on a broken wind-down payout
hpmaxi Oct 19, 2026
c34d169
refactor: check guards before the instance bump
hpmaxi Oct 19, 2026
fa9072d
refactor: tighten guard names, docs and tests
hpmaxi Oct 19, 2026
09898df
fix: ask the verifier's admin to sign once
hpmaxi Oct 20, 2026
6209600
refactor: drop unused caller from compliance
hpmaxi Oct 20, 2026
86a0c3e
fix: ask the oracle's admin to sign once
hpmaxi Oct 20, 2026
38734a5
fix: ask the token's admin to sign once
hpmaxi Oct 20, 2026
41fc13e
fix: ask the vault's admin to sign once
hpmaxi Oct 20, 2026
0e815cc
docs: one signature per admin call
hpmaxi Oct 20, 2026
d1255cc
test: pin what renounce_role asks to sign
hpmaxi Oct 20, 2026
961bec8
docs: fix kit spec admin and runbook lines
hpmaxi Oct 20, 2026
785c902
fix: refuse the vault as its own custodian
hpmaxi Oct 20, 2026
2bb65cc
feat: check the whole wiring before setup closes
hpmaxi Oct 20, 2026
83470d6
docs: list the new setup checks
hpmaxi Oct 20, 2026
9f7dc20
fix: refuse an oracle swap to a non-feed
hpmaxi Oct 20, 2026
8138a34
docs: list the new setup checks in every table
hpmaxi Oct 20, 2026
381146c
fix: extend new share balances in the same call
hpmaxi Oct 20, 2026
469031d
fix: extend role entries in the granting call
hpmaxi Oct 20, 2026
df5e997
docs: rewrite the ttl policy for each network
hpmaxi Oct 20, 2026
151c253
test: check when mainnet first renews an entry
hpmaxi Oct 20, 2026
891fc79
docs: say which calls renew each role entry
hpmaxi Oct 20, 2026
bdd966d
feat: add error code ranges for kit contracts
hpmaxi Oct 20, 2026
c138dfa
feat: declare each error enum within its range
hpmaxi Oct 20, 2026
df23868
docs: document the oracle entrypoints
hpmaxi Oct 20, 2026
a6beb35
docs: document compliance and the verifier
hpmaxi Oct 20, 2026
06c6f09
docs: document the share token entrypoints
hpmaxi Oct 20, 2026
d3c5c8b
docs: document the vault entrypoints
hpmaxi Oct 20, 2026
8594825
docs: publish the error code ranges
hpmaxi Oct 20, 2026
85b82ad
test: check docs fit the contract spec
hpmaxi Oct 20, 2026
527620d
docs: correct the cancel and payout docs
hpmaxi Oct 20, 2026
3180dd5
docs: open each contract with its design notes
hpmaxi Oct 20, 2026
e34e5b9
docs: open the shared crates with design notes
hpmaxi Oct 20, 2026
77b236e
docs: correct the attester and manager docs
hpmaxi Oct 20, 2026
39b3cdd
docs: call the timelock delay an announcement
hpmaxi Oct 20, 2026
bc7915b
docs: state what refunds and capital figures do
hpmaxi Oct 20, 2026
72c15a5
docs: tighten the kit spec wording
hpmaxi Oct 20, 2026
679f592
docs: tighten the design notes
hpmaxi Oct 20, 2026
2c3b67d
test: pin four claims of the design notes
hpmaxi Oct 20, 2026
f4ba9a4
docs: always clear a compromised attester's report
hpmaxi Oct 20, 2026
ea0d661
docs: drop stale manager and exit window wording
hpmaxi Oct 20, 2026
f07f5f6
docs: correct role, exit and feed claims
hpmaxi Oct 20, 2026
546fece
docs: narrow the token's compliance claims
hpmaxi Oct 20, 2026
d74f5ce
docs: list the spec doc test and its limit
hpmaxi Oct 20, 2026
66b60fc
refactor: name two guards for what they check
hpmaxi Oct 20, 2026
9f56507
docs: fix the upgrade test name in TESTING.md
hpmaxi Oct 20, 2026
793c81a
fix: correct the ttl policy and the extend order
hpmaxi Oct 20, 2026
9516c95
fix: extend the token instance on balance reads
hpmaxi Oct 20, 2026
306666d
Merge branch 'feat/shared-timelock-crate' into feat/instance-ttl
hpmaxi Oct 20, 2026
15d5176
Merge branch 'feat/instance-ttl' into docs/ttl-policy
hpmaxi Oct 20, 2026
1b8d5da
Merge branch 'docs/ttl-policy' into refactor/nav-pause
hpmaxi Oct 20, 2026
27bd415
Merge branch 'refactor/nav-pause' into feat/oracle-bounds
hpmaxi Oct 20, 2026
b89ee2c
Merge branch 'feat/oracle-bounds' into feat/contract-traits
hpmaxi Oct 20, 2026
7cde680
Merge branch 'feat/contract-traits' into feat/request-allowlist
hpmaxi Oct 20, 2026
c47c6fe
Merge branch 'feat/request-allowlist' into feat/settlement-dust
hpmaxi Oct 20, 2026
0d497c7
Merge branch 'feat/settlement-dust' into feat/cancel-window
hpmaxi Oct 20, 2026
92edf18
Merge branch 'feat/cancel-window' into feat/delisted-exit
hpmaxi Oct 20, 2026
995942b
Merge branch 'feat/delisted-exit' into feat/171-freeze-holds
hpmaxi Oct 20, 2026
192c2b6
Merge branch 'feat/171-freeze-holds' into feat/token-timelock
hpmaxi Oct 20, 2026
d6e8b36
Merge branch 'feat/token-timelock' into feat/oracle-timelock
hpmaxi Oct 20, 2026
7a0e606
Merge branch 'feat/oracle-timelock' into feat/vault-setup
hpmaxi Oct 20, 2026
e9c4699
Merge branch 'feat/vault-setup' into feat/oracle-swap
hpmaxi Oct 20, 2026
22de191
Merge branch 'feat/oracle-swap' into feat/vault-health
hpmaxi Oct 20, 2026
d542616
Merge branch 'feat/vault-health' into test/harness-wind-down
hpmaxi Oct 20, 2026
2683ba5
Merge branch 'test/harness-wind-down' into feat/legal-transfer
hpmaxi Oct 20, 2026
c546cc2
Merge branch 'feat/legal-transfer' into feat/compliance-timelock
hpmaxi Oct 20, 2026
eafe8dc
Merge branch 'feat/compliance-timelock' into fix/share-returns
hpmaxi Oct 20, 2026
4a7b8fd
Merge branch 'fix/share-returns' into fix/group-a-review
hpmaxi Oct 20, 2026
e05d9c6
Merge branch 'fix/group-a-review' into refactor/names
hpmaxi Oct 20, 2026
130b052
Merge branch 'refactor/names' into refactor/guards
hpmaxi Oct 20, 2026
065f797
Merge branch 'refactor/guards' into fix/single-admin-signature
hpmaxi Oct 20, 2026
9986d40
Merge branch 'fix/single-admin-signature' into feat/full-wiring-check
hpmaxi Oct 20, 2026
c1f1d5f
Merge branch 'feat/full-wiring-check' into fix/ttl-on-creation
hpmaxi Oct 20, 2026
c420f86
Merge branch 'docs/contract-spec' into docs/design-notes
hpmaxi Oct 20, 2026
3e706c2
Merge branch 'fix/ttl-on-creation' into docs/contract-spec
hpmaxi Oct 20, 2026
383774e
Merge pull request #245 from BootNodeDev/feat/shared-timelock-crate
hpmaxi Oct 20, 2026
52cedeb
Merge pull request #246 from BootNodeDev/feat/instance-ttl
hpmaxi Oct 20, 2026
5ba50d6
Merge branch 'docs/contract-spec' into docs/design-notes
hpmaxi Oct 20, 2026
2dd3ad4
docs(token): leave the authorization section out of balance and total…
hpmaxi Oct 20, 2026
366a231
Merge branch 'fix/ttl-on-creation' into docs/contract-spec
hpmaxi Oct 20, 2026
3d20c03
docs(vault): say deposited capital counts money in and out, not value
hpmaxi Oct 21, 2026
1afea90
fix(compliance): extend new entries when created
hpmaxi Oct 21, 2026
d08b3c6
docs: drop the compliance stub's ttl exception
hpmaxi Oct 21, 2026
264e7db
Merge pull request #247 from BootNodeDev/docs/ttl-policy
hpmaxi Oct 22, 2026
868f1a3
Merge pull request #248 from BootNodeDev/refactor/nav-pause
hpmaxi Oct 22, 2026
c5d1205
Merge pull request #249 from BootNodeDev/feat/oracle-bounds
hpmaxi Oct 22, 2026
06600ba
Merge pull request #250 from BootNodeDev/feat/contract-traits
hpmaxi Oct 22, 2026
246b81c
Merge pull request #251 from BootNodeDev/feat/request-allowlist
hpmaxi Oct 22, 2026
2debb88
Merge pull request #252 from BootNodeDev/feat/settlement-dust
hpmaxi Oct 22, 2026
b7e10cd
Merge pull request #253 from BootNodeDev/feat/cancel-window
hpmaxi Oct 22, 2026
5fb3afa
Merge pull request #254 from BootNodeDev/feat/delisted-exit
hpmaxi Oct 22, 2026
85b12e4
Merge pull request #255 from BootNodeDev/feat/171-freeze-holds
hpmaxi Oct 22, 2026
82345e8
Merge pull request #256 from BootNodeDev/feat/token-timelock
hpmaxi Oct 22, 2026
7ac1bdf
Merge pull request #257 from BootNodeDev/feat/oracle-timelock
hpmaxi Oct 22, 2026
f1f1b25
Merge pull request #258 from BootNodeDev/feat/vault-setup
hpmaxi Oct 22, 2026
868e458
docs: answer the review notes on the approved stack
hpmaxi Oct 22, 2026
6345660
Merge branch 'docs/design-notes' into fix/compliance-ttl-on-creation
hpmaxi Oct 22, 2026
213bbb4
ci: run the Wasm upgrade tests
luchobonatti Oct 22, 2026
a9453f1
ci: pin upload-artifact to a commit
luchobonatti Oct 22, 2026
8903568
ci: pin the quickstart image
luchobonatti Oct 22, 2026
e375e34
Merge pull request #311 from BootNodeDev/ci/310-upgrade-wasm-tests
hpmaxi Oct 22, 2026
8dfd82f
Merge remote-tracking branch 'origin/feedback' into feat/oracle-swap
hpmaxi Oct 22, 2026
85fb1cb
Merge branch 'feat/oracle-swap' into feat/vault-health
hpmaxi Oct 22, 2026
1c57639
Merge branch 'feat/vault-health' into test/harness-wind-down
hpmaxi Oct 22, 2026
76d6d96
Merge branch 'test/harness-wind-down' into feat/legal-transfer
hpmaxi Oct 22, 2026
10ec0d6
Merge branch 'feat/legal-transfer' into feat/compliance-timelock
hpmaxi Oct 22, 2026
f412843
Merge branch 'feat/compliance-timelock' into fix/share-returns
hpmaxi Oct 22, 2026
9ccc15c
Merge branch 'fix/share-returns' into fix/group-a-review
hpmaxi Oct 22, 2026
5579153
Merge branch 'fix/group-a-review' into refactor/names
hpmaxi Oct 22, 2026
2ee51e0
Merge branch 'refactor/names' into refactor/guards
hpmaxi Oct 22, 2026
f7b5bb6
Merge branch 'refactor/guards' into fix/single-admin-signature
hpmaxi Oct 22, 2026
d8449fd
Merge branch 'fix/single-admin-signature' into feat/full-wiring-check
hpmaxi Oct 22, 2026
d23f45b
Merge branch 'feat/full-wiring-check' into fix/ttl-on-creation
hpmaxi Oct 22, 2026
f0b16a2
Merge branch 'fix/ttl-on-creation' into docs/contract-spec
hpmaxi Oct 22, 2026
69d69d3
Merge branch 'docs/contract-spec' into docs/design-notes
hpmaxi Oct 22, 2026
358a7fb
Merge branch 'docs/design-notes' into fix/compliance-ttl-on-creation
hpmaxi Oct 22, 2026
c11e148
docs: say what holders can do if the manager or the attester stops
hpmaxi Oct 22, 2026
23e6884
Merge branch 'docs/design-notes' into fix/compliance-ttl-on-creation
hpmaxi Oct 22, 2026
0db2b50
fix(token): check the contract a swap installs
hpmaxi Oct 22, 2026
7402304
test(harness): propose a valid verifier in the signature guard
hpmaxi Oct 22, 2026
a33d704
docs: say that claims mint and burn shares, not pricing
hpmaxi Oct 23, 2026
f4036e9
Merge branch 'fix/compliance-ttl-on-creation' into fix/332-check-toke…
hpmaxi Oct 23, 2026
1e5f02a
Merge branch 'docs/design-notes' into fix/compliance-ttl-on-creation
hpmaxi Oct 23, 2026
a069a0c
Merge branch 'main' into feedback
hpmaxi Oct 23, 2026
ce2ea4e
Merge branch 'feedback' into feat/oracle-swap
hpmaxi Oct 23, 2026
b23185e
Merge branch 'feat/oracle-swap' into feat/vault-health
hpmaxi Oct 23, 2026
c71fa0f
Merge branch 'feat/vault-health' into test/harness-wind-down
hpmaxi Oct 23, 2026
05536c2
Merge branch 'test/harness-wind-down' into feat/legal-transfer
hpmaxi Oct 23, 2026
0099f77
Merge branch 'feat/legal-transfer' into feat/compliance-timelock
hpmaxi Oct 23, 2026
80215d6
Merge branch 'feat/compliance-timelock' into fix/share-returns
hpmaxi Oct 23, 2026
2160a5e
Merge branch 'fix/share-returns' into fix/group-a-review
hpmaxi Oct 23, 2026
818235e
Merge branch 'fix/group-a-review' into refactor/names
hpmaxi Oct 23, 2026
394677c
Merge branch 'refactor/names' into refactor/guards
hpmaxi Oct 23, 2026
c741c38
Merge branch 'refactor/guards' into fix/single-admin-signature
hpmaxi Oct 23, 2026
9d9ffbb
Merge branch 'fix/single-admin-signature' into feat/full-wiring-check
hpmaxi Oct 23, 2026
f2f32d9
Merge branch 'feat/full-wiring-check' into fix/ttl-on-creation
hpmaxi Oct 23, 2026
4cb765d
Merge branch 'fix/ttl-on-creation' into docs/contract-spec
hpmaxi Oct 23, 2026
5b26ef6
Merge branch 'docs/contract-spec' into docs/design-notes
hpmaxi Oct 23, 2026
b9e771d
Merge branch 'fix/compliance-ttl-on-creation' into fix/332-check-toke…
hpmaxi Oct 23, 2026
424b1aa
Merge branch 'docs/design-notes' into fix/compliance-ttl-on-creation
hpmaxi Oct 23, 2026
7101864
Merge pull request #259 from BootNodeDev/feat/oracle-swap
hpmaxi Oct 26, 2026
01ac209
Merge pull request #260 from BootNodeDev/feat/vault-health
hpmaxi Oct 26, 2026
be65764
Merge pull request #261 from BootNodeDev/test/harness-wind-down
hpmaxi Oct 26, 2026
e7cc41e
Merge pull request #262 from BootNodeDev/feat/legal-transfer
hpmaxi Oct 26, 2026
cb5957e
Merge pull request #263 from BootNodeDev/feat/compliance-timelock
hpmaxi Oct 26, 2026
c5a3a7f
Merge pull request #264 from BootNodeDev/fix/share-returns
hpmaxi Oct 26, 2026
03c52e0
Merge pull request #265 from BootNodeDev/fix/group-a-review
hpmaxi Oct 26, 2026
f259c62
Merge pull request #272 from BootNodeDev/refactor/names
hpmaxi Oct 26, 2026
ffe5f59
Merge pull request #273 from BootNodeDev/refactor/guards
hpmaxi Oct 26, 2026
43d73c6
Merge pull request #274 from BootNodeDev/fix/single-admin-signature
hpmaxi Oct 26, 2026
895166c
Merge pull request #275 from BootNodeDev/feat/full-wiring-check
hpmaxi Oct 26, 2026
3b04a07
ci: run a wind-down on a throwaway vault
hpmaxi Oct 26, 2026
39e3f55
ci: fold the wind-down build command
hpmaxi Oct 26, 2026
9ea72bd
ci: add fmt, clippy and cargo-deny checks
hpmaxi Oct 26, 2026
fc39600
feat(oracle): anchor a proof to every report
hpmaxi Oct 26, 2026
e3f9276
test(harness): attest with the sample valuation
hpmaxi Oct 26, 2026
ba794b0
test(oracle): tighten the proof reference tests
hpmaxi Oct 26, 2026
de7a524
docs: correct the proof reference notes
hpmaxi Oct 26, 2026
a8fcf87
fix(token): accept external rules in a swap
hpmaxi Oct 26, 2026
4103bb4
test(token): pin the exact compliance swap rule
hpmaxi Oct 26, 2026
479f3a4
refactor(token): clarify the compliance check
hpmaxi Oct 26, 2026
40df3c5
Merge branch 'fix/332-check-token-swaps' into ci/343-wind-down-in-ci
hpmaxi Oct 26, 2026
3d66ea6
Merge branch 'fix/332-check-token-swaps' into ci/336-rust-checks
hpmaxi Oct 26, 2026
f3c03f8
Merge branch 'fix/332-check-token-swaps' into feat/346-proof-reference
hpmaxi Oct 26, 2026
a336579
Merge pull request #276 from BootNodeDev/fix/ttl-on-creation
hpmaxi Oct 27, 2026
d759243
Merge pull request #277 from BootNodeDev/docs/contract-spec
hpmaxi Oct 27, 2026
046a485
Merge pull request #278 from BootNodeDev/docs/design-notes
hpmaxi Oct 27, 2026
e6dfd00
Merge pull request #299 from BootNodeDev/fix/compliance-ttl-on-creation
hpmaxi Oct 27, 2026
38c9def
Merge pull request #334 from BootNodeDev/fix/332-check-token-swaps
hpmaxi Oct 27, 2026
6e5114b
Merge pull request #344 from BootNodeDev/ci/343-wind-down-in-ci
hpmaxi Oct 27, 2026
9cdec9c
Merge pull request #347 from BootNodeDev/ci/336-rust-checks
hpmaxi Oct 27, 2026
0f9122c
Merge pull request #348 from BootNodeDev/feat/346-proof-reference
hpmaxi Oct 27, 2026
4f0bb21
chore: point the README and the app at the new testnet deployment
luchobonatti Oct 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 46 additions & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,16 @@ jobs:
if ! command -v stellar &> /dev/null; then
cargo binstall --locked stellar-cli@27.0.0
fi
# The upgrade tests run built Wasm, so they need the fixture, both
# contracts and their probe builds first (docs/TESTING.md).
- name: Run the Wasm upgrade tests
run: |
stellar contract build --manifest-path fixtures/upgrade-target/Cargo.toml
stellar contract build --package share-token
stellar contract build --package nav-oracle
CARGO_TARGET_DIR=target/upgrade-probe stellar contract build --package share-token --features upgrade_probe
CARGO_TARGET_DIR=target/upgrade-probe stellar contract build --package nav-oracle --features upgrade_probe
SOROBAN_SDK_BUILD_SYSTEM_SUPPORTS_SPEC_SHAKING_V2=1 cargo test --locked -p async-vault -p nav-oracle --features upgrade_wasm with_wasm
- name: Start Stellar local network
# No tagged releases upstream, so this pins main as read on 2026-08-14
uses: stellar/quickstart@864f91d804c0061bd11ef8872d3e318581febb55
Expand Down Expand Up @@ -148,10 +158,45 @@ jobs:
run: npm run test:guards -w scripts/harness
env:
HARNESS_NETWORK: local
- name: Build the vault without the wind-down minimum
run:
CARGO_TARGET_DIR=target/short-wind-down stellar contract build
--package async-vault --features short_wind_down
- name: Run a wind-down on a throwaway vault on the local network
run: npm run test:wind-down -w scripts/harness
env:
HARNESS_NETWORK: local
- name: Keep the harness report when it fails
if: failure()
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: harness-runs
path: scripts/harness/runs/
if-no-files-found: ignore

rust-checks:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: |
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
target/
key: ${{ runner.os }}-cargo-checks-${{ hashFiles('**/Cargo.lock') }}
# rustup reads rust-toolchain.toml, which includes clippy and rustfmt.
- name: Check formatting
run: cargo fmt --all -- --check
- name: Lint with warnings as errors
run: cargo clippy --locked --workspace --all-targets -- -D warnings
- name: Check licences, advisories, bans and sources
uses: EmbarkStudios/cargo-deny-action@3c6349835b2b7b196a839186cb8b78e02f7b5f25 # v2.1.1
with:
# Replaces the action's default --all-features, so CI runs the
# same command as docs/TESTING.md.
arguments: --locked
command: check
58 changes: 50 additions & 8 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,18 @@ result. Three states per side, none skipped: **pending, priced, claimed**.

What the contracts enforce:

1. **Entry is gated** by a post-KYC allowlist, checked on the receiver of a
subscription (enforced on share claim in contracts today; request-time
check is targeted for a future milestone) and on every share transfer.
1. **Only allowlisted addresses enter.** The post-KYC allowlist is checked
when a subscription is requested, again when its shares are minted, and on
every share transfer.
2. **A covered claim always pays.** Once priced and covered, a cash claim cannot
be blocked by a pause, a stale valuation, or the investor losing their
allowlist place. Priced claims are never re-priced and never identity-gated;
a delisted, non-frozen investor leaves through the exit-only cash path.
3. **Cancellation is atomic and single-step**, open only until the attestation
that prices the request is accepted. There is no instant exit.
a delisted, non-frozen investor leaves through the exit-only cash path,
including a deposit that was priced before the delisting.
3. **Cancellation is atomic and single-step**, open only while the vault cannot
price the request: the attestation that prices it closes cancellation, and
cancellation reopens if that report expires, the NAV is paused or the vault
is paused. There is no instant exit.

Five authorities, each a native Stellar multisig: governance, compliance,
attestation, treasury, guardian. Testnet only. Not audited.
Expand Down Expand Up @@ -111,15 +114,54 @@ Not recorded here on purpose. The reference base kept them in this file and they
drifted: its `AGENTS.md` and its generated client pointed at two different vault
contracts. The addresses emitted by the deploy script are authoritative.

## Code conventions

- **Crate names.** Shared crates in `crates/` start with `strata-`
(`strata-timelock`, `strata-storage`, `strata-bindings`), so a path such as
`strata_timelock::DAY_DURATION` reads as the kit's own code.
- **Addresses in entrypoints.** In an entrypoint the kit defines, `caller` is
the account that must sign the call, and `holder` is the account whose
position, request or balance the call is about. When one account is both, the
entrypoint takes `holder` and that account signs. The two ends of a share
transfer are `from` and `to`, and other addresses are named for what they
are (`custodian`, `vault`, the allowlisted `account`). OpenZeppelin trait
methods keep their own names (`operator`, `user_address`).
- **Named errors.** Contract code fails with a named error variant, never with
`unwrap`, `expect` or a bare `panic!`. Tests may unwrap. Each contract
declares its error enum through `strata_bindings::error_enum!`, which fails
the build if a code leaves the contract's block (`docs/kit-spec.md`, section
7).
- **No boolean switches.** A new entrypoint does one thing. Two behaviours get
two functions, like `freeze_partial_tokens` and `unfreeze_partial_tokens`,
not one function that takes a `bool`.
- **Guards.** Each precondition is a `pub(crate) fn` in the contract's
`guards.rs`. Its name is the condition it checks (`positive_amount`,
`not_winding_down`), and it panics with a named error when the condition
fails. An entrypoint calls its guards first and then does its work, so its
preconditions are the first lines a reader sees.
- **Doc comments.** Every public entrypoint has one, in OpenZeppelin's style: a
one-line summary, then `# Arguments` with units (asset base units, share base
units, WAD prices, seconds or ledgers), `# Errors`, `# Events` and
`# Authorization`. Every error variant's doc says when it happens. Keep them
short: they are stored in the Wasm as part of the contract spec, which keeps
1,024 bytes of each doc and drops the rest without a warning.
`every_contract_doc_fits_the_spec` (`crates/strata-bindings/tests/spec_docs.rs`)
fails when one is longer.
- **Design notes.** Each contract's `lib.rs` opens with a `//! # Design`
section: five to ten bullets, each a choice and its trade-off, in plain words
and with no issue numbers or decision ids.
- **Exact pins.** Every crates.io dependency, dev-dependencies included, is
pinned with `=` to the version in `Cargo.lock`.

## Conventions

- Conventional Commits, imperative, subject ≤ 50 chars. **No AI attribution.**
- Issue-first: every PR closes an issue (`Closes #N`). Branches are
`feat/<issue>-<desc>`, `fix/...`, `chore/...`.
- Issue bodies follow the templates in `.github/ISSUE_TEMPLATE/`, 200 words of
prose hard cap. Titles are natural language with no prefix.
- Exact dependency pins. Dependencies are never upgraded mid-milestone; each
migration is its own issue in the following one.
- Dependencies are never upgraded mid-milestone; each migration is its own
issue in the following one.
- Estimates live in the `Estimate` field of the
[project board](https://github.com/orgs/BootNodeDev/projects/29), not in issue
bodies.
Expand Down
45 changes: 32 additions & 13 deletions Cargo.lock

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

51 changes: 40 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,11 @@ deploy from `environments.toml` → `[staging.contracts]`, which is the record.
<!-- deployed-addresses:start -->
| Contract | Address |
| --- | --- |
| `async_vault` | `CD5LYYXGOJ7R23P6D7YUN6DUJQYMI23KEUEOIFKXOSWOX3KHKTXRITED` |
| `nav_oracle` | `CBKVMUMIX7MXYHX5K34N5HYZOP6S2VGWF7MN27RIWBV3A3WD3X3L63CO` |
| `share_token` | `CDOISQTQRCYOTH6S3DFQ6UKJ2TEXLNO7NFIGOZS4RZL63IRCVXXCGP5N` |
| `identity_verifier` | `CCTCCY7AVFAIRGEWWJZT2UDMBHS3NGNKVUWLY43CHDNN75AQEV6P3EOY` |
| `compliance` | `CDEH6FJBK7NDFLALO3X3GDXZUREYHUSNC7ODPM64RBG3BBXW2USMW7OO` |
| `async_vault` | `CCDWVENC7GNFO757JON65OKWJXHYIEGPVPDWVCGRZOPAHOQURPHQRPUG` |
| `nav_oracle` | `CADX6LVWOQ6DGFHEQ6AMJHDPKWOO2RTHEEIERVPWHOUJCN3WNEGYHHL3` |
| `share_token` | `CDRAUSDVE7OKWKCJJNPD4HYTMLGF5XFVG5DY7KMLQCBHJTW53TYN7UGK` |
| `identity_verifier` | `CBZEZBVOFNEYBGWRMON7WDFAXCNLH3DEAF3EDIS7PJRSLY6BK7XN5O7J` |
| `compliance` | `CDHEEBIAMKLMJHJZHQ3R63PVWQUMQAX4WY6WDODZOY2E5X5GNSFFG6DR` |
| `asset` | `CCOHKZLQ5EAD2A3RLHYHH7W4K2TNLNELXUVLWZIZALH45WXHH5H3QV7E` |
<!-- deployed-addresses:end -->

Expand Down Expand Up @@ -139,16 +139,21 @@ Output of a real run from a fresh clone. Contract IDs differ on every run.
deploying to local (http://localhost:8000/rpc)
account keys in .env.keys.local (13 new)
funded 13 accounts; 0 already existed
asset contract CDKWXRAHPQVFOAEBOOWWR62ZXAE2IV4V47PATFN7IX4XDW5QIUUL7D2B
compliance CDGKQCYSMTDRBO7SYV3V72H6AMCQ3UNQFKUU4AD5GSU2I32XDYFS6F3U
identity_verifier CCZE76VWEWJ47NSFMIXCKU3L55CZZTI5JJY4CSYAWPO3WXPDFXUCA5G6
share_token CD6IA3BOPFX7VNADJ3GFK7IZGPVPNZA6HBCF425CNPSQ2GN7QZ3UUCP2
nav_oracle CAHD5ZKMIDD67ZEJUB5ACR62FMAYMQJ2KCRV2MBDNXWT7WEZ2VV3MRDD
async_vault CDQNMAZP7D5IA7AXZGK3XWYPFD2LDR6V5HQD2OLXZJYNQN4BMNN6SXWJ
asset contract CCW7OKVOXBBBX3YK6O7F6TZPNIFG32OG4UY7R2K6NSWZUI4R75QCEPVT
compliance CDPCD2BQQKVQBQFAFI4YBLN3TRX34J5NZUQQMUBGHPYNY64LCEM63DTL
identity_verifier CC4SRUIMKOBZSEO2GKGVQMDWPWCBJBBIMYYE7BBCUEZE6VMD3SFQDAMW
share_token CDC7SRTDZIMJSLC5AONUD3FIFYZGMFOHRAS7LLYV2ATJRT7RMTMQO2DG
nav_oracle CCUUBP3RGOIZZL4DUGRL4FBOSQJZKBPNQ7VUWIN6UOOYBJYYKGNT5E52
async_vault CB2KVM2WHLXDZRHGCYPTGE7PZM6OORXCNVBUMC3L7GY5KX4BA6NMADXE
clients generated
vault holds share_token manager role
share_token bound to the vault, setup finished
vault is allowlisted
share_token bound to compliance
compliance bound to the vault, setup finished
nav_oracle bound to the vault, setup finished
vault setup finished
health {"addresses_distinct":true,"allowlisted":true,"compliance_bound":true,"custodian_set":true,"decimals_match":true,"feed_answers":true,"feed_valid":false,"freshness_covers_notice":true,"oracle_bound":true,"setup_open":false,"sole_token_manager":true,"token_bound":true,"vault_unfrozen":true}
wrote deployed.local.json
```

Expand All @@ -159,8 +164,32 @@ integration suites against that deployment:
```sh
npm run test:happy-path -w scripts/harness
npm run test:guards -w scripts/harness
CARGO_TARGET_DIR=target/short-wind-down stellar contract build --package async-vault --features short_wind_down
npm run test:wind-down -w scripts/harness
```

Deploy afresh before each run of the suites. The guards leave the vault's
notice at 10 seconds, and lowering it back waits for the timelock, so a second
run against the same deployment can fail wherever it prices an epoch right
after closing it. `test:wind-down` ignores `deployed.local.json`: it deploys
its own throwaway vault set, built from the `short_wind_down` wasm above, so
it can reach an active wind-down without the real seven-day minimum.

### Keeping a deployment alive

Every contract extends its own storage when it is called, but a deployment
nobody calls archives after 30 days. Restore and extend all of it with:

```sh
STELLAR_ACCOUNT=<identity or secret> npm run extend -w scripts/harness
```

It reads the testnet contracts from `environments.toml`, restores any
archived instance or Wasm, and extends each by 30 days. Any funded account
pays, since extending needs no authority. Use `--env <name>` for another
environment, or `--config <record>` for a deployment record. The
[TTL policy](./docs/kit-spec.md#5-storage-lifetime-ttl-policy) says what each
contract extends on its own.

## Reference base

Expand Down
10 changes: 7 additions & 3 deletions contracts/async-vault/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,13 @@ doctest = false

[dependencies]
soroban-sdk = { workspace = true }
storage = { path = "../../crates/storage" }
strata-storage = { path = "../../crates/strata-storage" }
stellar-access = { workspace = true }
stellar-macros = { workspace = true }
stellar-contract-utils = { workspace = true }
bindings = { path = "../../crates/bindings" }
stellar-tokens = { workspace = true }
strata-bindings = { path = "../../crates/strata-bindings" }
strata-timelock = { path = "../../crates/strata-timelock" }


[dev-dependencies]
Expand All @@ -24,7 +26,9 @@ nav-oracle = { path = "../nav-oracle" }
share-token = { path = "../share-token" }
compliance = { path = "../compliance" }
identity-verifier = { path = "../identity-verifier" }
proptest = "1"
proptest = "=1.11.0"

[features]
upgrade_wasm = []
# Drops the wind-down minimum to zero for the local harness. Never deployed.
short_wind_down = []
Loading
Loading