Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
222 commits
Select commit Hold shift + click to select a range
e4ef66e
ift wip
vaporif Dec 19, 2025
9420f24
cpi validation
vaporif Dec 19, 2025
adb8fc6
ift selector
vaporif Dec 19, 2025
70285f4
role check
vaporif Dec 19, 2025
e7235fa
gmp cpi
vaporif Dec 20, 2025
b13be85
lint
vaporif Dec 20, 2025
ab2d177
cleanup
vaporif Dec 20, 2025
f320cd2
cleanup
vaporif Dec 20, 2025
c9a9845
cleanup
vaporif Dec 20, 2025
4eac09d
tests
vaporif Dec 20, 2025
50b9cdb
tests
vaporif Dec 20, 2025
f9cd921
tests upd
vaporif Dec 20, 2025
71cb726
update
vaporif Dec 20, 2025
4d7e225
mint constraint
vaporif Dec 21, 2025
abde516
refactor
vaporif Dec 21, 2025
711cbca
cover edgecases
vaporif Dec 30, 2025
abd21dc
ift e2e
vaporif Dec 30, 2025
7881cd7
solana ift adr
vaporif Jan 4, 2026
129ba2d
cleanup adr
vaporif Jan 4, 2026
74922ef
cleanups
vaporif Jan 4, 2026
07f2b95
cleanup
vaporif Jan 4, 2026
3dbbf95
transfer fix
vaporif Jan 5, 2026
22793e7
idiomatic change
vaporif Jan 5, 2026
e8342f3
ift bindings
vaporif Jan 5, 2026
98744d7
ift instr update
vaporif Jan 5, 2026
503f2cb
e2e update
vaporif Jan 5, 2026
d5efc78
cleanups
vaporif Jan 5, 2026
e66a3e3
cleanup
vaporif Jan 5, 2026
d177d48
fix err
vaporif Jan 5, 2026
e2eddcb
cleanup
vaporif Jan 5, 2026
dd64dc5
cleanupf
vaporif Jan 5, 2026
9253b5b
+test
vaporif Jan 5, 2026
f2440f3
cleanup
vaporif Jan 5, 2026
c4b4924
optimize cu usage
vaporif Jan 5, 2026
d9e0d1c
clippy
vaporif Jan 5, 2026
44e6682
e2e test update
vaporif Jan 5, 2026
30866f5
add ift deployment
vaporif Jan 5, 2026
3d76d2d
sync ids
vaporif Jan 5, 2026
de280e0
logging and keypair
vaporif Jan 5, 2026
6424885
fix timeout
vaporif Jan 6, 2026
f00c98e
ift e2e update
vaporif Jan 6, 2026
adb9cfa
working ift transfer
vaporif Jan 6, 2026
f4cb56c
add tests
vaporif Jan 6, 2026
6b34497
fix cosmos to solana ift
vaporif Jan 7, 2026
fa64da0
update tests
vaporif Jan 7, 2026
f77e0f0
cpi for gmp
vaporif Jan 7, 2026
f3ea806
update adr
vaporif Jan 8, 2026
5c122aa
adr
vaporif Jan 8, 2026
e5aaa8e
callback routing part
vaporif Jan 8, 2026
9040185
adr cleanups
vaporif Jan 8, 2026
4dbe2c9
helpers refact
vaporif Jan 8, 2026
88320f0
cleanups
vaporif Jan 8, 2026
597726e
cleanups
vaporif Jan 8, 2026
bb661ad
add just install
vaporif Jan 8, 2026
6affbeb
remove log file
vaporif Jan 8, 2026
7c47018
cleanup tests
vaporif Jan 8, 2026
e75018b
remove upstream caller
vaporif Jan 8, 2026
7018dbc
ack failure rough firxes
vaporif Jan 12, 2026
fa43404
fmt
vaporif Jan 12, 2026
951b61f
go lint
vaporif Jan 12, 2026
878a6aa
lint
vaporif Jan 12, 2026
1a8e58e
fmt
vaporif Jan 12, 2026
da33b3b
lint
vaporif Jan 12, 2026
3a9407d
discriminator encoding
vaporif Jan 12, 2026
f4957c5
cleanup
vaporif Jan 12, 2026
a1ed79c
Merge branch 'main' into vaporif/solana-ift
vaporif Jan 12, 2026
ce98525
remove excessive logging
vaporif Jan 12, 2026
f883165
timeout callback
vaporif Jan 12, 2026
33ef7f3
callback helper
vaporif Jan 12, 2026
a244ff6
cleanups
vaporif Jan 12, 2026
6f11cdf
cleanups
vaporif Jan 12, 2026
c793363
cleanups
vaporif Jan 12, 2026
1a59ee6
fmt
vaporif Jan 12, 2026
42b81a0
trim comments
vaporif Jan 12, 2026
f8defde
cleanups
vaporif Jan 12, 2026
891889b
update adr
vaporif Jan 12, 2026
86330b8
cleanups
vaporif Jan 12, 2026
1f88292
adr
vaporif Jan 12, 2026
f78cbf0
alternatives
vaporif Jan 12, 2026
e7b95fb
add tests
vaporif Jan 12, 2026
0f38176
addtional test
vaporif Jan 12, 2026
600d307
upd
vaporif Jan 12, 2026
c543e7a
Merge branch 'main' into vaporif/solana-ift
vaporif Jan 14, 2026
02803d0
remove not required stuff
vaporif Jan 20, 2026
8c569f7
Update docs/adr/solana-ics27-gmp-architecture.md
vaporif Jan 20, 2026
0094389
drop sysvar & cpi checks
vaporif Jan 20, 2026
fcdba2d
dummy upd
vaporif Jan 20, 2026
d624c60
Merge branch 'main' into vaporif/solana-ift
vaporif Jan 21, 2026
e9c12e7
lint
vaporif Jan 21, 2026
df53cfc
Merge branch 'vaporif/solana-ift' of https://github.com/cosmos/solidi…
vaporif Jan 21, 2026
521737e
post merge fi
vaporif Jan 21, 2026
84c2879
merge error
vaporif Jan 21, 2026
f31b496
post merge fix
vaporif Jan 21, 2026
9f3d84b
add alternative
vaporif Jan 21, 2026
c9f96c9
Merge branch 'main' into vaporif/solana-ift
vaporif Jan 25, 2026
b9fba31
wip update
vaporif Jan 25, 2026
1d4489f
fixes
vaporif Jan 25, 2026
7f78eee
Merge branch 'main' into vaporif/solana-ift
vaporif Jan 25, 2026
0ba4e12
ift rework into multi tx
vaporif Jan 25, 2026
1791b19
Merge branch 'vaporif/solana-ift' of https://github.com/cosmos/solidi…
vaporif Jan 25, 2026
eb16834
gmp changes updated
vaporif Jan 25, 2026
7108c49
upd
vaporif Jan 25, 2026
80d2d67
add tests
vaporif Jan 25, 2026
9f51674
adr update
vaporif Jan 25, 2026
741fdec
update adr
vaporif Jan 25, 2026
4452bf1
update pda
vaporif Jan 25, 2026
60fcd63
lint comments
vaporif Jan 25, 2026
026ef46
helpers for full flow
vaporif Jan 25, 2026
7b9aaac
ift test push
vaporif Jan 25, 2026
426bd11
update adr
vaporif Jan 25, 2026
cec7dd0
cleanup
vaporif Jan 25, 2026
ddbc29d
revoke mint
vaporif Jan 25, 2026
548e73c
add revoke mint
vaporif Jan 25, 2026
12de716
solana client
vaporif Jan 25, 2026
1345123
users fix
vaporif Jan 25, 2026
da9d7d3
patch anchor-go add denom
vaporif Jan 25, 2026
d75b311
custom typeurl, events copy hack
vaporif Jan 25, 2026
782062f
add ica
vaporif Jan 26, 2026
b2af0c9
proper ica
vaporif Jan 26, 2026
11b072e
proto files, packet source port extraction
vaporif Jan 26, 2026
9458c31
packets refact
vaporif Jan 26, 2026
2bf49eb
fix bug
vaporif Jan 26, 2026
295386f
update doc
vaporif Jan 26, 2026
665f0ab
drop ift folder
vaporif Jan 26, 2026
03735c6
anchor patchfix
vaporif Jan 26, 2026
d0617ed
always sync keys before generating types
vaporif Jan 26, 2026
7cf8d38
register cosmos bridge with solana constructor options
vaporif Jan 26, 2026
01bd047
ift integration with wfchain
vaporif Jan 26, 2026
25d4fe2
update adr
vaporif Jan 26, 2026
e28ebd8
cleanup
vaporif Jan 26, 2026
3cbb65f
test case for tests
vaporif Jan 26, 2026
c109348
use test-case to make tests more compact
vaporif Jan 26, 2026
1c99a69
inline tests
vaporif Jan 26, 2026
04db8fc
rstest
vaporif Jan 26, 2026
5519ca4
cover edge cases
vaporif Jan 26, 2026
f8ab30d
clippy fixes
vaporif Jan 27, 2026
82ef2de
fix lint
vaporif Jan 27, 2026
3912b6b
updatesr
vaporif Jan 27, 2026
dbd60c4
upd
vaporif Jan 27, 2026
990d9d2
todo
vaporif Jan 27, 2026
2fe1d86
cleanups
vaporif Jan 27, 2026
f75db77
cleanup
vaporif Jan 27, 2026
b947a18
todos
vaporif Jan 27, 2026
228139a
todos
vaporif Jan 27, 2026
8be579f
todos
vaporif Jan 27, 2026
24193fc
todos
vaporif Jan 27, 2026
2175bbb
upd
vaporif Jan 27, 2026
b295200
reren instr
vaporif Jan 27, 2026
717f238
remove client id
vaporif Jan 27, 2026
d519797
update format
vaporif Jan 27, 2026
8bb8bb0
renamings
vaporif Jan 27, 2026
8aa9fcd
rename instruction
vaporif Jan 27, 2026
745d13d
update adr
vaporif Jan 27, 2026
24b9077
refactor bridge config
vaporif Jan 28, 2026
bd10736
cleanup muts
vaporif Jan 28, 2026
a778466
comment
vaporif Jan 28, 2026
fd61a29
refactor
vaporif Jan 28, 2026
fb99bb0
note
vaporif Jan 28, 2026
79a5c0e
comments
vaporif Jan 28, 2026
51d307e
uncomments and refacts
vaporif Jan 28, 2026
85095fe
fix test for wfchain ack failure
vaporif Jan 28, 2026
d6bdc23
Merge branch 'main' into vaporif/solana-ift
vaporif Jan 28, 2026
ebbf77c
adrupdate & todos
vaporif Jan 28, 2026
ee553db
add for existing tokens
vaporif Jan 28, 2026
66f7304
adr updated
vaporif Jan 28, 2026
b469db6
upd
vaporif Jan 28, 2026
a4f7dd1
chore: use solana-constructor branch
srdtrk Jan 28, 2026
7a1b699
updates, sync with wfchain
vaporif Jan 28, 2026
fdcff69
Merge remote-tracking branch 'origin/vaporif/solana-ift' into vaporif…
srdtrk Jan 28, 2026
9b73fc3
commentscomments
vaporif Jan 28, 2026
b2c9aa6
Merge branch 'vaporif/solana-ift' of https://github.com/cosmos/solidi…
vaporif Jan 28, 2026
685d9c8
comment
vaporif Jan 28, 2026
7da7aad
revert
vaporif Jan 28, 2026
a05483e
lint
vaporif Jan 28, 2026
2529d9f
comment
vaporif Jan 28, 2026
6bdab71
todo
vaporif Jan 28, 2026
d7a9d9e
ci: fix
srdtrk Jan 28, 2026
6499eb6
fix lint
vaporif Jan 28, 2026
bb75338
coverage ignore tests
vaporif Jan 28, 2026
d34a3b7
encoding revert
vaporif Jan 28, 2026
a887625
cleanup
vaporif Jan 28, 2026
20cd024
remove codecov off
vaporif Jan 28, 2026
3af6414
disable codecov solana
vaporif Jan 28, 2026
3054fe7
coverage off
vaporif Jan 28, 2026
a1789d2
cleanup coverage
vaporif Jan 28, 2026
2d90efc
drop lints workspace
vaporif Jan 28, 2026
a6c624a
return lints
vaporif Jan 28, 2026
ba4468e
lints
vaporif Jan 28, 2026
f69e90f
doc warn
vaporif Jan 28, 2026
dac481a
docstyle
vaporif Jan 28, 2026
ddc8863
doc lints
vaporif Jan 28, 2026
c5255b2
pedantic clippy
vaporif Jan 28, 2026
e2e335b
nightly clippy
vaporif Jan 28, 2026
5a72678
iftmintmsg accorting to spec
vaporif Jan 28, 2026
79904ae
upd
vaporif Jan 28, 2026
0bcf999
tag
vaporif Jan 28, 2026
7febd36
tag
vaporif Jan 28, 2026
7583e9a
update version
vaporif Jan 28, 2026
9901f33
upd
vaporif Jan 28, 2026
edd9ec8
docker image
vaporif Jan 28, 2026
fddd9e4
chore: review comments
srdtrk Jan 29, 2026
2cf24a4
Merge remote-tracking branch 'origin/vaporif/solana-ift' into vaporif…
srdtrk Jan 29, 2026
fbbd7b2
imp: justfile
srdtrk Jan 29, 2026
04e8e6d
update
vaporif Jan 29, 2026
c08693f
Merge branch 'vaporif/solana-ift' of https://github.com/cosmos/solidi…
vaporif Jan 29, 2026
1cc5913
imp: rename
srdtrk Jan 29, 2026
a46822c
push ift
vaporif Jan 29, 2026
0b93157
pda upd
vaporif Jan 29, 2026
b249f4d
imp: justfile
srdtrk Jan 29, 2026
37dd31f
comments
vaporif Jan 29, 2026
4257bb8
lint
vaporif Jan 29, 2026
bd7067e
Merge remote-tracking branch 'origin/vaporif/solana-ift' into vaporif…
srdtrk Jan 29, 2026
ab56625
imp: fix name
srdtrk Jan 29, 2026
cecfffc
chore: name fix
srdtrk Jan 29, 2026
baacf89
chore: regen pda
srdtrk Jan 29, 2026
93e675c
chore: regen sol types
srdtrk Jan 29, 2026
97615dd
fix: test
srdtrk Jan 29, 2026
9665f67
chore: naming fixes
srdtrk Jan 29, 2026
d9bf83c
fixes
vaporif Jan 29, 2026
8620376
Merge branch 'vaporif/solana-ift' of https://github.com/cosmos/solidi…
vaporif Jan 29, 2026
1cd1e39
return clusters
vaporif Jan 29, 2026
0192779
regen
vaporif Jan 29, 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
21 changes: 0 additions & 21 deletions .github/workflows/solana.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,6 @@ jobs:
- name: Install just
uses: extractions/setup-just@v2

- name: Install cargo-llvm-cov
uses: taiki-e/install-action@cargo-llvm-cov

- name: Install protobuf compiler
run: |
sudo apt-get update
Expand All @@ -75,24 +72,6 @@ jobs:
env:
RUST_BACKTRACE: 1

# Exclude test programs
- name: Run coverage
run: |
EXCLUDE='programs/(dummy-ibc-app'
EXCLUDE+='|gmp-counter-app'
EXCLUDE+='|malicious-caller'
EXCLUDE+='|mock-ibc-app'
EXCLUDE+='|mock-light-client)/'
cargo llvm-cov --workspace --lcov --output-path lcov.info --ignore-filename-regex "$EXCLUDE"
working-directory: programs/solana

- uses: codecov/codecov-action@v5
with:
files: programs/solana/lcov.info
flags: solana
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

- name: Run Solana linting
run: just lint-solana

4 changes: 4 additions & 0 deletions Cargo.lock

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

2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ members = [
]
resolver = "2"

[workspace.lints]

[workspace.package]
version = "0.1.0"
edition = "2021"
Expand Down
4 changes: 4 additions & 0 deletions buf.gen.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ plugins:
- local: protoc-gen-go-grpc
out: e2e/interchaintestv8/types/
opt: paths=source_relative
# TODO: use go-proto in e2e rather than its own types
- local: protoc-gen-go
out: packages/go-proto/
opt: paths=source_relative

inputs:
- directory: proto
69 changes: 68 additions & 1 deletion docs/adr/solana-ics27-gmp-architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

**Status**: Implemented
**Date**: 2025-09-18
**Last Updated**: 2025-11-07
**Last Updated**: 2026-01-08

## Executive Summary

Expand Down Expand Up @@ -436,6 +436,72 @@ fn extract_payload_accounts(
}
```

## Packet Lifecycle Callbacks

### Problem

Sender programs (e.g., IFT) need to handle packet timeouts and acknowledgements for recovery (e.g., refund burned tokens).

### Solution: Pull-Based Result Storage

GMP stores results in `GMPCallResultAccount` PDAs. Sender programs read these accounts via their own claim instructions.

1. Router calls GMP's `on_timeout_packet` or `on_ack_packet`
2. GMP creates `GMPCallResultAccount` PDA with the result
3. Anyone calls sender's claim instruction (e.g., `IFT.claim_refund`)
4. Sender reads GMP's result PDA and processes accordingly

### Alternatives Considered

**1. Push-based callback forwarding**: GMP forwards callbacks to sender programs via CPI. Rejected because it increases CPI depth and requires GMP to know sender interfaces.

**2. IFT registers as its own IBC app**: Rejected because it duplicates GMP's packet handling logic.

**3. Router calls sender directly**: Rejected because Router doesn't know GMP-specific packet encoding.

## CPI Authorization via PDA Signing

### The Problem

Solana's instruction sysvar only exposes the **top-level transaction instruction**, not the immediate CPI caller. For layered architectures like IFT → GMP → Router, we need a way for Router to verify that GMP (the registered IBC app) authorized the call.

### Solution: App Signer PDA

Instead of tracking CPI callers, Router validates that the registered app **signed** the request using its app state PDA:

```rust
// Router's send_packet validation
let (expected_app_signer, _) = Pubkey::find_program_address(
&[b"ibc_app_state", ibc_app.port_id.as_bytes()],
&ibc_app.app_program_id, // e.g., GMP program ID
);
require!(
ctx.accounts.app_signer.key() == expected_app_signer,
RouterError::UnauthorizedSender
);
```

### How It Works

1. **Registration**: GMP registers as the IBC app for "gmp" port
2. **PDA Derivation**: GMP's app state PDA is `["ibc_app_state", "gmp"]` + GMP program ID
3. **CPI Chain**: When IFT calls GMP's `send_call`, GMP signs with its app state PDA via `invoke_signed`
4. **Validation**: Router verifies the signer matches the expected PDA for the registered app

This approach:
- Works regardless of CPI depth (IFT → GMP → Router all works)
- Only the registered app can sign with its PDA (cryptographic guarantee)
- No need to track or whitelist upstream callers
- Follows Solana's idiomatic PDA-based authorization pattern

### Alternatives Considered

**1. Upstream caller whitelisting**: Maintain a list of authorized upstream programs (e.g., IFT) in the `IBCApp` account. Router would accept calls if top-level program is in the whitelist. Rejected because it adds admin overhead, requires storage for the whitelist, and PDA signing is more elegant.

**2. Instruction sysvar inspection**: Walk the instruction sysvar to find the immediate CPI caller. Rejected because Solana's sysvar doesn't expose the CPI call stack, only top-level instructions.

**3. Pass "trusted" flag from GMP**: GMP validates its caller and passes a flag to Router. Rejected because it creates a security vulnerability—any program could pass the flag.

## Call Result Callbacks

When a GMP packet is acknowledged or times out, the GMP program creates a `GMPCallResultAccount` PDA to store the result:
Expand All @@ -461,6 +527,7 @@ See [Namespaced Sequence Calculation](solana-storage-architecture.md#namespaced-

**Relayer Integration**: The relayer computes and returns `gmp_result_pda` in `SolanaPacketTxs` for each ack/timeout packet, allowing callers to query results after relay.


## Security Model

- **Account Control**: Only GMP program can sign via `invoke_signed` - users cannot directly control PDAs
Expand Down
Loading
Loading