Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
495 commits
Select commit Hold shift + click to select a range
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
19ecf0b
ci: build the app against the contracts the branch deploys
luchobonatti Oct 26, 2026
434f409
ci: register the asset alias after the scaffold creates the identity
luchobonatti Oct 26, 2026
53c6308
Merge remote-tracking branch 'origin/feedback' into ci/342-build-agai…
luchobonatti Oct 26, 2026
c4a68c2
ci: declare the alias resolver parameter of contractIds
luchobonatti Oct 26, 2026
c3b91ee
feat(app): rename the ripcord to the NAV pause
luchobonatti Oct 23, 2026
4d3b42e
feat(app): follow the oracle's bounds in Set the oracle limits
luchobonatti Oct 23, 2026
d31e7ce
feat(app): follow the renamed vault arguments
luchobonatti Oct 26, 2026
a8fcf87
fix(token): accept external rules in a swap
hpmaxi Oct 26, 2026
9d6ef2a
docs: write the threat model
hpmaxi Oct 26, 2026
f723017
docs: say only the holder starts an exit
hpmaxi Oct 26, 2026
c054b2d
docs: note setup checks the sole minter
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
0072a96
chore: run CI on protocol 30 and read its ledgers
hpmaxi Oct 26, 2026
a49b8b3
docs: correct the threat model after review
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
d4d1352
Merge remote-tracking branch 'origin/feat/346-proof-reference' into c…
hpmaxi Oct 26, 2026
5ef6243
docs: follow the swap rule and narrow claims
hpmaxi Oct 26, 2026
53d6855
ci: build the clients against the workspace sdk
hpmaxi Oct 26, 2026
ec31760
feat(app): run the vault's timelocked changes through the console
luchobonatti Oct 27, 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
baebe71
Merge remote-tracking branch 'origin/feedback' into ci/342-build-agai…
luchobonatti Oct 27, 2026
5772ec6
Merge branch 'ci/342-build-against-branch-contracts' into feat/302-na…
luchobonatti Oct 27, 2026
78bfd04
Merge branch 'feat/302-nav-pause' into feat/341-rename-request-arguments
luchobonatti Oct 27, 2026
260c1a9
Merge branch 'feat/341-rename-request-arguments' into feat/306-vault-…
luchobonatti Oct 27, 2026
85c35a5
feat(app): run the share token's admin changes through its timelock
luchobonatti Oct 27, 2026
ff40f4c
Merge branch 'feedback' into chore/315-protocol-30
hpmaxi Oct 27, 2026
9756483
feat(app): collect a proof reference when attesting
luchobonatti Oct 27, 2026
4f0bb21
chore: point the README and the app at the new testnet deployment
luchobonatti Oct 27, 2026
47816be
Merge remote-tracking branch 'origin/feedback' into ci/342-build-agai…
luchobonatti Oct 27, 2026
ad6e4ca
Merge branch 'ci/342-build-against-branch-contracts' into feat/302-na…
luchobonatti Oct 27, 2026
e53beae
Merge branch 'feat/302-nav-pause' into feat/341-rename-request-arguments
luchobonatti Oct 27, 2026
7c6bf52
Merge branch 'feat/341-rename-request-arguments' into feat/306-vault-…
luchobonatti Oct 27, 2026
b13b4a8
Merge branch 'feat/306-vault-timelock' into feat/305-token-timelock
luchobonatti Oct 27, 2026
d0f97c3
Merge branch 'feat/305-token-timelock' into feat/235-attest-proof
luchobonatti Oct 27, 2026
227bb3c
Merge pull request #358 from BootNodeDev/feat/235-attest-proof
luchobonatti Oct 27, 2026
b25fab2
Merge pull request #357 from BootNodeDev/feat/305-token-timelock
luchobonatti Oct 27, 2026
3c6ff9a
Merge pull request #356 from BootNodeDev/feat/306-vault-timelock
luchobonatti Oct 27, 2026
37ae9c1
ci: pin the local network image by digest
hpmaxi Oct 27, 2026
c767b66
Merge pull request #350 from BootNodeDev/feat/341-rename-request-argu…
luchobonatti Oct 27, 2026
020d848
ci: drop the image digest pin for now
hpmaxi Oct 27, 2026
563f437
Merge pull request #339 from BootNodeDev/feat/302-nav-pause
luchobonatti Oct 27, 2026
2a63283
ci: pin the local network image by digest
hpmaxi Oct 27, 2026
190881b
Merge pull request #349 from BootNodeDev/ci/342-build-against-branch-…
luchobonatti Oct 27, 2026
2e1696e
Merge pull request #354 from BootNodeDev/chore/353-threat-model
hpmaxi Oct 27, 2026
641765d
Merge pull request #355 from BootNodeDev/chore/315-protocol-30
hpmaxi Oct 27, 2026
48726e1
feat(app): name HolderNotEligible and fix the token pause copy
luchobonatti Oct 27, 2026
39c01f6
feat(app): run the oracle's admin changes through its timelock
luchobonatti Oct 27, 2026
1c134d1
fix(vault): report a missing request first
hpmaxi Oct 27, 2026
107227f
docs: say what the extend script keeps alive
hpmaxi Oct 27, 2026
fa39d71
feat(app): show investors the allowlist and freeze outcomes
luchobonatti Oct 28, 2026
8ff7011
feat(app): let investors claim their wind-down share
luchobonatti Oct 28, 2026
8f93aed
chore(nix): provide stellar-scaffold in the devshell
hpmaxi Oct 28, 2026
7692a96
fix(vault): close setup only on empty books
hpmaxi Oct 28, 2026
88a1313
fix(harness): check timelock keys against rust
hpmaxi Oct 28, 2026
8d61381
feat(app): move the compliance transfer to legal transfer
luchobonatti Oct 28, 2026
45fc106
fix(vault): refuse deposits on an invalid feed
hpmaxi Oct 28, 2026
079c4cc
Merge remote-tracking branch 'origin/feedback' into feat/318-presimulate
luchobonatti Oct 28, 2026
d8ac10e
fix(harness): restore archived ledger entries
hpmaxi Oct 28, 2026
25764ed
fix(vault): keep a priced epoch's deposit total
hpmaxi Oct 28, 2026
c20513d
fix(harness): find pending changes in storage
hpmaxi Oct 28, 2026
be880a7
fix(vault): name the refusals after a clawback
hpmaxi Oct 28, 2026
a1b63b9
fix(harness): use the record's network
hpmaxi Oct 28, 2026
213eb74
docs(vault): say what funding the gap lifts
hpmaxi Oct 28, 2026
3b60b14
fix(harness): validate record shape, flag value
hpmaxi Oct 28, 2026
99eb6ca
fix(harness): reject malformed contracts
hpmaxi Oct 28, 2026
c2c22e9
ci: split the build job and fix the cargo cache
hpmaxi Oct 28, 2026
1c424fe
refactor(vault): check the epoch before reading it
hpmaxi Oct 28, 2026
25c05a2
docs(vault): say what setup and clawbacks refuse
hpmaxi Oct 28, 2026
fa378d6
docs: say which pull requests skip the heavy CI
hpmaxi Oct 28, 2026
837e06a
feat(app): show the withdrawable figure
hpmaxi Oct 28, 2026
42e7878
docs: define the vault figures, link oracle tests
hpmaxi Oct 28, 2026
13afcfa
docs: add the on-chain monitoring plan
hpmaxi Oct 28, 2026
fe1f5ed
fix(harness): require -- to pass extend flags
hpmaxi Oct 28, 2026
238fb2b
fix(harness): name the file for a bad record
hpmaxi Oct 28, 2026
3afad37
fix(harness): catch a lagging extend before success
hpmaxi Oct 28, 2026
dcd0e1f
feat(vault): record when the open epoch started
hpmaxi Oct 28, 2026
c01c14a
ci: harden the network wait and docs filter
hpmaxi Oct 28, 2026
2422db3
feat(vault): add a minimum epoch duration
hpmaxi Oct 28, 2026
a6ed3ac
feat(vault): let anyone seal a long-open epoch
hpmaxi Oct 28, 2026
16f0cb7
fix(contracts): refuse hand-overs in a wind-down
hpmaxi Oct 28, 2026
45dc429
docs: describe sealing after the minimum
hpmaxi Oct 28, 2026
98f7d87
fix(vault): stop deposits at a wind-down proposal
hpmaxi Oct 28, 2026
2d77241
feat(oracle): floor min_answer at a millionth
hpmaxi Oct 28, 2026
2d802d5
test(harness): call the new vault functions
hpmaxi Oct 28, 2026
cd945e3
fix(vault): credit whole rounds in a wind-down
hpmaxi Oct 28, 2026
a31184c
test(vault): extend sealing review coverage
hpmaxi Oct 28, 2026
4e72bba
docs: round out min-epoch-duration docs
hpmaxi Oct 28, 2026
0797fe1
fix(token): refuse transfers into the vault
hpmaxi Oct 28, 2026
96c142a
fix(token): keep freezes liftable in a wind-down
hpmaxi Oct 28, 2026
282307f
docs(token): state the compliance grant limit
hpmaxi Oct 28, 2026
6c7eefe
chore(harness): grant a backup compliance holder
hpmaxi Oct 28, 2026
ca1aae6
Merge pull request #377 from BootNodeDev/chore/devshell-stellar-scaffold
hpmaxi Oct 28, 2026
c9f9b8d
Merge fix/376-setup-clawback-epochs (#380) into the review stack
hpmaxi Oct 28, 2026
1400bec
Merge fix/373-extend-runbook (#382) into the review stack
hpmaxi Oct 28, 2026
e9682f6
Merge ci/352-faster-ci (#381) into the review stack
hpmaxi Oct 28, 2026
654226e
Merge feat/371-withdrawable-figure (#383) into the review stack
hpmaxi Oct 28, 2026
97da2c8
Merge docs/367-monitoring-plan (#384) into the review stack
hpmaxi Oct 28, 2026
42c22aa
Merge fix/375-wind-down-freeze (#386) into the review stack
hpmaxi Oct 28, 2026
556813e
Merge feat/335-permissionless-seal (#385) into the review stack
hpmaxi Oct 28, 2026
eba33ec
test: pin the token's two transfer modes
hpmaxi Oct 29, 2026
fd69e28
docs: record the kit's transfer modes
hpmaxi Oct 29, 2026
95c1d5b
docs(arch): narrow the wind-down freeze exception
hpmaxi Oct 29, 2026
77878e4
test(token,oracle): cover accept-TTL refresh
hpmaxi Oct 29, 2026
49a6275
docs(vault): fix claim_wind_down errors and doc
hpmaxi Oct 29, 2026
356126c
docs(matrix): note wind-down guard on deposits
hpmaxi Oct 29, 2026
669ee04
docs(kit-spec): a stale floor blocks set_config
hpmaxi Oct 29, 2026
45eb5d7
docs(threat-model): link R9 backup and R10 to R1
hpmaxi Oct 29, 2026
f307c7e
docs(vault): document credited equals pot
hpmaxi Oct 29, 2026
0a43cb8
fix(harness): keep secret keys out of the record
hpmaxi Oct 29, 2026
2053db3
docs(vault): fix claim_wind_down error order
hpmaxi Oct 29, 2026
4cd7334
fix(harness): drop old record secrets on connect
hpmaxi Oct 29, 2026
b029660
Merge fix/375-wind-down-freeze (#386) into the review stack
hpmaxi Oct 29, 2026
97a8a5c
Merge docs/369-transfer-modes (#387) into the review stack
hpmaxi Oct 29, 2026
ab7deda
fix(harness): seed without vitest or secrets
hpmaxi Oct 29, 2026
49fcf72
fix(harness): reset balances, read them by entry
hpmaxi Oct 29, 2026
29aba27
feat(vault): add the DepositRefunded event
hpmaxi Oct 29, 2026
6049262
feat(harness): record the commit and wasm hashes
hpmaxi Oct 29, 2026
a875baa
docs: rename refund_deposit to return_escrow
hpmaxi Oct 29, 2026
43fd65b
ci: fail the upgrade step when no test runs
hpmaxi Oct 29, 2026
00a3464
fix(vault): check the notice end for overflow
hpmaxi Oct 29, 2026
7f4f8dd
feat(harness): keep an unfinished deploy's ids
hpmaxi Oct 29, 2026
f4e0a57
test(vault): claims pay while nav paused or stale
hpmaxi Oct 29, 2026
ef1f725
test: tie role literals to their constants
hpmaxi Oct 29, 2026
89c5b27
test: scan role attrs across lines and paths
hpmaxi Oct 29, 2026
87067d6
fix(vault): refuse a wind-down claim by the vault
hpmaxi Oct 29, 2026
c9f441b
test(vault): make wind-down and epoch tests fail
hpmaxi Oct 29, 2026
1933610
docs: say when a proposal's eta moves
hpmaxi Oct 29, 2026
84554b9
test(vault): upgrade the vault over live state
hpmaxi Oct 29, 2026
dcb2192
fix(harness): outlast the cooldown in notice test
hpmaxi Oct 29, 2026
80faf56
docs: state the freeze and deposit limits
hpmaxi Oct 29, 2026
0554611
test(vault): drop the stateless upgrade fixture
hpmaxi Oct 29, 2026
79d9b76
docs: qualify the delisted claim property
hpmaxi Oct 29, 2026
6adaa2e
docs(arch): describe the deploy as built
hpmaxi Oct 29, 2026
48e525f
docs(arch): note the compliance grant exception
hpmaxi Oct 29, 2026
2adad10
docs(spec): state share decimals and ledger time
hpmaxi Oct 29, 2026
ee5224d
docs: add the grant differences note
hpmaxi Oct 29, 2026
b330a21
docs: quote the proposal in the grant note
hpmaxi Oct 29, 2026
16c4803
test(harness): call vault through typed methods
hpmaxi Oct 29, 2026
3e295ef
docs: tighten the grant note
hpmaxi Oct 29, 2026
7507edf
test(vault): cut repeated setup and checks
hpmaxi Oct 29, 2026
b3be5ae
fix(harness): retry a stale account lookup
hpmaxi Oct 29, 2026
84a842e
fix(harness): wait on ledger time for the notice
hpmaxi Oct 29, 2026
c7d42e5
docs: finish aligning the multisig and claim text
hpmaxi Oct 29, 2026
385a665
fix(harness): retry account lookups in clients
hpmaxi Oct 29, 2026
3056500
test: pin the delisted wind-down claim
hpmaxi Oct 29, 2026
5e3affa
test(vault): cover a longer wind-down delay
hpmaxi Oct 29, 2026
39f86d6
test(harness): name the method in each check
hpmaxi Oct 29, 2026
3bdabb5
chore: pin prettier, axios and the client sdk
hpmaxi Oct 29, 2026
af90ef3
test(harness): keep the retry test fast
hpmaxi Oct 29, 2026
10a1d55
fix(harness): keep provenance tests quiet
hpmaxi Oct 29, 2026
820e0cb
ci: add a checksum-verified tool installer
hpmaxi Oct 29, 2026
ed84727
docs: say when spec shaking v2 needs the variable
hpmaxi Oct 29, 2026
c290b7a
ci: scan prs for secrets and require every job
hpmaxi Oct 29, 2026
9e23e2a
ci: fail safe when the change filter is empty
hpmaxi Oct 29, 2026
eb47db7
feat(harness): set the vault notice at deploy
hpmaxi Oct 29, 2026
77301e1
fix(harness): read provenance before deploying
hpmaxi Oct 29, 2026
1f700ed
docs(harness): limit the hash check to one platform
hpmaxi Oct 29, 2026
27deec2
test(harness): tighten provenance and notice checks
hpmaxi Oct 29, 2026
e843eb4
docs: say why the deploy uses single keys
hpmaxi Oct 29, 2026
d404a64
fix(vault): keep cancellation open if a feed traps
hpmaxi Oct 29, 2026
628996c
docs: name a trapping feed in the threat model
hpmaxi Oct 29, 2026
f7250b3
fix(vault): treat an unreadable nav as no price
hpmaxi Oct 29, 2026
709506d
test(vault): name the error in each refusal
hpmaxi Oct 29, 2026
a253ac9
docs: define a readable price as one that resolves
hpmaxi Oct 29, 2026
a5228cc
test(vault): pin missing signatures as auth errors
hpmaxi Oct 29, 2026
f80798b
Merge pull request #380 from BootNodeDev/fix/376-setup-clawback-epochs
hpmaxi Oct 29, 2026
7c169b4
Merge pull request #382 from BootNodeDev/fix/373-extend-runbook
hpmaxi Oct 29, 2026
2bd42c8
Merge pull request #381 from BootNodeDev/ci/352-faster-ci
hpmaxi Oct 29, 2026
55a2432
Merge pull request #383 from BootNodeDev/feat/371-withdrawable-figure
hpmaxi Oct 29, 2026
1593476
Merge pull request #384 from BootNodeDev/docs/367-monitoring-plan
hpmaxi Oct 29, 2026
9f80f75
test(vault): check signatures and pause gaps
hpmaxi Oct 29, 2026
0329ab6
Merge remote-tracking branch 'origin/feedback' into feat/335-permissi…
hpmaxi Oct 29, 2026
c39949c
Merge pull request #385 from BootNodeDev/feat/335-permissionless-seal
hpmaxi Oct 29, 2026
273448a
Merge feedback into fix/375-wind-down-freeze
hpmaxi Oct 29, 2026
9b9a8b5
test(vault): name the error in the other refusals
hpmaxi Oct 29, 2026
4265e4c
test: name the error in oracle, token, compliance
hpmaxi Oct 29, 2026
761a2b7
Merge remote-tracking branch 'origin/feedback' into feat/340-holder-n…
luchobonatti Oct 29, 2026
d0f3e30
Merge remote-tracking branch 'origin/feedback' into HEAD
luchobonatti Oct 29, 2026
1143c74
Merge branch 'feat/340-holder-not-eligible' into HEAD
luchobonatti Oct 29, 2026
0238ff8
Merge remote-tracking branch 'origin/feedback' into HEAD
luchobonatti Oct 29, 2026
8edf8ed
Merge remote-tracking branch 'origin/feedback' into HEAD
luchobonatti Oct 29, 2026
3b045f5
test(oracle): keep tests like the vault
hpmaxi Oct 29, 2026
aa526ae
Merge pull request #333 from BootNodeDev/feat/318-presimulate
luchobonatti Oct 29, 2026
5f7b715
feat(app): name the setup, feed and escrow refusals
luchobonatti Oct 29, 2026
2f1dcdd
Merge feedback into chore/372-harness-hardening
hpmaxi Oct 29, 2026
d6b6a60
Merge pull request #386 from BootNodeDev/fix/375-wind-down-freeze
hpmaxi Oct 29, 2026
9b3443c
Merge pull request #387 from BootNodeDev/docs/369-transfer-modes
hpmaxi Oct 29, 2026
8f44380
Merge pull request #400 from BootNodeDev/test/396-signatures-and-pause
hpmaxi Oct 29, 2026
100bccb
Merge pull request #399 from BootNodeDev/test/393-named-refusals
hpmaxi Oct 29, 2026
1b6b4c4
Merge feedback into test/374-tests-that-fail
hpmaxi Oct 29, 2026
3195dcb
Merge feedback into docs/378-align-docs
hpmaxi Oct 29, 2026
0d1c827
Merge feedback into fix/391-feed-attested-at
hpmaxi Oct 29, 2026
75195a9
feat(app): set the minimum epoch duration
luchobonatti Oct 29, 2026
38a08b0
Merge remote-tracking branch 'origin/feedback' into merge/337
luchobonatti Oct 29, 2026
e77918f
Merge remote-tracking branch 'origin/feedback' into merge/338
luchobonatti Oct 29, 2026
6e8d07a
Merge pull request #360 from BootNodeDev/feat/340-holder-not-eligible
luchobonatti Oct 29, 2026
9fc815c
Merge remote-tracking branch 'origin/feedback' into HEAD
luchobonatti Oct 29, 2026
4ff7101
fix(app): fit the wind-down claim to the prepared flow
luchobonatti Oct 29, 2026
aaa2768
Merge pull request #366 from BootNodeDev/feat/304-allowlist-freeze-ou…
luchobonatti Oct 29, 2026
0a358e3
Merge branch 'feedback' into feat/338-legal-transfer
luchobonatti Oct 29, 2026
f4c4fed
Merge pull request #379 from BootNodeDev/feat/338-legal-transfer
luchobonatti Oct 29, 2026
ac959f1
Merge remote-tracking branch 'origin/feedback' into HEAD
luchobonatti Oct 29, 2026
5600a32
Merge pull request #406 from BootNodeDev/feat/403-map-new-vault-errors
luchobonatti Oct 29, 2026
93f76b4
Merge branch 'feedback' into feat/337-oracle-timelock
luchobonatti Oct 29, 2026
0ad4e04
Merge pull request #361 from BootNodeDev/feat/337-oracle-timelock
luchobonatti Oct 29, 2026
a812fc5
Merge branch 'feedback' into feat/404-min-epoch-duration
luchobonatti Oct 29, 2026
fa42681
fix(app): return events from prepared transactions
luchobonatti Oct 29, 2026
75344ad
feat(app): block admin accepts during a wind-down
luchobonatti Oct 29, 2026
af42de4
Merge pull request #364 from BootNodeDev/docs/362-extend-coverage
hpmaxi Oct 30, 2026
9e8e14c
Merge pull request #365 from BootNodeDev/fix/363-claim-error-order
hpmaxi Oct 30, 2026
8f5a106
Merge pull request #390 from BootNodeDev/chore/372-harness-hardening
hpmaxi Oct 30, 2026
384a11e
Merge pull request #388 from BootNodeDev/docs/378-align-docs
hpmaxi Oct 30, 2026
1aa1c46
Merge feedback into fix/391-feed-attested-at
hpmaxi Oct 30, 2026
a5644f8
Merge pull request #398 from BootNodeDev/fix/391-feed-attested-at
hpmaxi Oct 30, 2026
cb973e2
Merge feedback into test/374-tests-that-fail
hpmaxi Oct 30, 2026
b67a352
Merge pull request #389 from BootNodeDev/test/374-tests-that-fail
hpmaxi Oct 30, 2026
f4351cf
Merge remote-tracking branch 'origin/feedback' into test/397-named-re…
hpmaxi Oct 30, 2026
39e33ce
Merge pull request #401 from BootNodeDev/test/397-named-refusals-rest
hpmaxi Oct 30, 2026
40f4b59
Merge branch 'feedback' into test/nav-oracle-test-layout
hpmaxi Oct 30, 2026
c1d79b6
Merge pull request #402 from BootNodeDev/test/nav-oracle-test-layout
hpmaxi Oct 30, 2026
efd61fa
chore: point the README and app at testnet
hpmaxi Oct 30, 2026
10269ab
Merge pull request #413 from BootNodeDev/chore/412-redeploy-testnet
hpmaxi Oct 30, 2026
289025a
Merge branch 'feedback' into feat/404-min-epoch-duration
luchobonatti Oct 30, 2026
dce77db
Merge pull request #408 from BootNodeDev/feat/404-min-epoch-duration
luchobonatti Oct 30, 2026
9ab9688
Merge branch 'feedback' into feat/409-prepared-tx-events
luchobonatti Oct 30, 2026
94e73c1
Merge pull request #410 from BootNodeDev/feat/409-prepared-tx-events
luchobonatti Oct 30, 2026
e93d044
Merge branch 'feedback' into feat/405-accept-admin-wind-down
luchobonatti Oct 30, 2026
c956319
Merge pull request #411 from BootNodeDev/feat/405-accept-admin-wind-down
luchobonatti Oct 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
297 changes: 253 additions & 44 deletions .github/workflows/build.yml

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions .gitleaksignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# A captured RPC fetch response used as a test fixture, not a secret
scripts/harness/lib/ttl.test.ts:generic-api-key:22
91 changes: 73 additions & 18 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,23 @@ 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.

Five authorities, each a native Stellar multisig: governance, compliance,
attestation, treasury, guardian. Testnet only. Not audited.
allowlist place. Priced claims are never re-priced, and a cash payout never
needs the identity check; a delisted, non-frozen investor leaves through
the exit-only cash path, including a deposit that was priced before the
delisting. A compliance freeze holds the claim until it is lifted.
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 meant to be a native Stellar multisig: governance,
compliance, attestation, treasury, guardian. The deploy script gives each one
key for now. Testnet only. Not audited.

## Reference base

Expand All @@ -48,7 +53,9 @@ does not carry over. Read it for Soroban and OZ mechanics only.
- **Tests:** `cargo test` from the repo root runs every workspace member against
the in-memory `Env`. There is no unit-test runner for `app/` or `app-lib/`;
`e2e/` runs Playwright separately. CI runs `cargo test --locked` on every pull
request.
request except one that changes only Markdown files outside `docs/evidence/`:
that one skips the Rust and local-network jobs. The secret scan runs on
every pull request.
- **Toolchain:** `nix develop` provides it, or rustup honours
`rust-toolchain.toml`.

Expand Down Expand Up @@ -80,7 +87,13 @@ apply as the corresponding code lands here.
`scripts/generate-clients.mjs`, which reads the contract ids and RPC URL of
`ADDRESSES_ENV` (default `staging`) from `environments.toml` and writes
`app-lib/clients/<contract>/` from each contract's on-chain spec, with Node
alone. Those generated types are the only contract types; `app-lib/contracts.ts`
alone. `development` declares no ids: there the script resolves each
`[development.contracts.<name>]` block plus an alias named `asset` through
`stellar contract alias show`, so CI builds the app against the contracts
the branch just deployed. The scaffold registers the block aliases when it
deploys; the asset is a Stellar Asset Contract a developer registers once with
`stellar contract asset deploy --asset native --alias asset --source me`
against the local network. Those generated types are the only contract types; `app-lib/contracts.ts`
re-exports them and builds each runtime client with `new Client(...)` from its
generated `src/index`, whose embedded spec means no page fetches a contract's
instance or Wasm. Vite dedupes `@stellar/stellar-sdk` so a client's nested copy
Expand All @@ -89,10 +102,13 @@ apply as the corresponding code lands here.
A fresh clone builds `app` with no cargo, no stellar CLI and no local network,
but needs RPC access to the selected network at build time. A local scaffold
build writes the same directory from the WASM.
- When a tool must drive `cargo` directly rather than the CLI, set
`SOROBAN_SDK_BUILD_SYSTEM_SUPPORTS_SPEC_SHAKING_V2=1`. The build script fails
without it and its error names neither the variable nor this way out, so
coverage runs and size checks look impossible until you read the SDK source.
- When `cargo` itself builds a contract for the Wasm target, rather than
`stellar contract build` (a size check with
`cargo build --release --target wasm32v1-none`, for example), set
`SOROBAN_SDK_BUILD_SYSTEM_SUPPORTS_SPEC_SHAKING_V2=1`. soroban-sdk's build
script stops that build without it, and its error names neither the variable
nor this way out. Host builds such as `cargo test` and `cargo clippy` never
need it.
- Change a contract's `__constructor` and you must change its `constructor_args`
in `environments.toml` in the same commit. Otherwise the scaffold build still
exits 0 and CI fails minutes later on a client count, naming neither the
Expand All @@ -111,15 +127,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.

1 change: 0 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
[workspace]
resolver = "2"
members = ["crates/*", "contracts/*"]
exclude = ["fixtures/upgrade-target"]

[workspace.package]
edition = "2021"
Expand Down
Loading
Loading