2026-05-11 14:51:50 +02:00
|
|
|
{
|
|
|
|
|
"version": "0.1.0",
|
|
|
|
|
"name": "stablecoin",
|
|
|
|
|
"instructions": [
|
feat(stablecoin): implement `open_position`
Adds the `open_position` instruction to the Stablecoin Program. The instruction
claims a per-owner `Position` PDA, initializes a collateral vault token holding
via a chained `Token::InitializeAccount` under the vault's PDA authority, and
moves `collateral_amount` from the user's holding into the vault with a chained
`Token::Transfer`. `Position` is persisted with `collateral_amount` and
`debt_amount = 0`; the debt path is deferred to `generate_debt`.
- Add `Position` struct, `OpenPosition` instruction variant, and
`compute_position_pda{,_seed}` / `compute_position_vault_pda{,_seed}` helpers
in `stablecoin_core` with domain-separated PDA seeds.
- Implement `open_position::open_position` mirroring the ATA `create` and AMM
`new_definition` patterns: authorization and uninitialized-state asserts, PDA
verification, and same-transaction chained `InitializeAccount` + `Transfer`.
- Wire the new instruction through the SPEL guest and regenerate the stablecoin
IDL artifact.
- Cover the happy path, all assertion paths, and PDA determinism /
non-collision in 11 new unit tests.
2026-05-11 17:14:27 -03:00
|
|
|
{
|
|
|
|
|
"name": "open_position",
|
|
|
|
|
"accounts": [
|
|
|
|
|
{
|
|
|
|
|
"name": "owner",
|
|
|
|
|
"writable": false,
|
2026-06-26 16:55:23 -03:00
|
|
|
"signer": true,
|
feat(stablecoin): implement `open_position`
Adds the `open_position` instruction to the Stablecoin Program. The instruction
claims a per-owner `Position` PDA, initializes a collateral vault token holding
via a chained `Token::InitializeAccount` under the vault's PDA authority, and
moves `collateral_amount` from the user's holding into the vault with a chained
`Token::Transfer`. `Position` is persisted with `collateral_amount` and
`debt_amount = 0`; the debt path is deferred to `generate_debt`.
- Add `Position` struct, `OpenPosition` instruction variant, and
`compute_position_pda{,_seed}` / `compute_position_vault_pda{,_seed}` helpers
in `stablecoin_core` with domain-separated PDA seeds.
- Implement `open_position::open_position` mirroring the ATA `create` and AMM
`new_definition` patterns: authorization and uninitialized-state asserts, PDA
verification, and same-transaction chained `InitializeAccount` + `Transfer`.
- Wire the new instruction through the SPEL guest and regenerate the stablecoin
IDL artifact.
- Cover the happy path, all assertion paths, and PDA determinism /
non-collision in 11 new unit tests.
2026-05-11 17:14:27 -03:00
|
|
|
"init": false
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "position",
|
2026-06-26 16:55:23 -03:00
|
|
|
"writable": true,
|
feat(stablecoin): implement `open_position`
Adds the `open_position` instruction to the Stablecoin Program. The instruction
claims a per-owner `Position` PDA, initializes a collateral vault token holding
via a chained `Token::InitializeAccount` under the vault's PDA authority, and
moves `collateral_amount` from the user's holding into the vault with a chained
`Token::Transfer`. `Position` is persisted with `collateral_amount` and
`debt_amount = 0`; the debt path is deferred to `generate_debt`.
- Add `Position` struct, `OpenPosition` instruction variant, and
`compute_position_pda{,_seed}` / `compute_position_vault_pda{,_seed}` helpers
in `stablecoin_core` with domain-separated PDA seeds.
- Implement `open_position::open_position` mirroring the ATA `create` and AMM
`new_definition` patterns: authorization and uninitialized-state asserts, PDA
verification, and same-transaction chained `InitializeAccount` + `Transfer`.
- Wire the new instruction through the SPEL guest and regenerate the stablecoin
IDL artifact.
- Cover the happy path, all assertion paths, and PDA determinism /
non-collision in 11 new unit tests.
2026-05-11 17:14:27 -03:00
|
|
|
"signer": false,
|
2026-06-26 16:55:23 -03:00
|
|
|
"init": true
|
feat(stablecoin): implement `open_position`
Adds the `open_position` instruction to the Stablecoin Program. The instruction
claims a per-owner `Position` PDA, initializes a collateral vault token holding
via a chained `Token::InitializeAccount` under the vault's PDA authority, and
moves `collateral_amount` from the user's holding into the vault with a chained
`Token::Transfer`. `Position` is persisted with `collateral_amount` and
`debt_amount = 0`; the debt path is deferred to `generate_debt`.
- Add `Position` struct, `OpenPosition` instruction variant, and
`compute_position_pda{,_seed}` / `compute_position_vault_pda{,_seed}` helpers
in `stablecoin_core` with domain-separated PDA seeds.
- Implement `open_position::open_position` mirroring the ATA `create` and AMM
`new_definition` patterns: authorization and uninitialized-state asserts, PDA
verification, and same-transaction chained `InitializeAccount` + `Transfer`.
- Wire the new instruction through the SPEL guest and regenerate the stablecoin
IDL artifact.
- Cover the happy path, all assertion paths, and PDA determinism /
non-collision in 11 new unit tests.
2026-05-11 17:14:27 -03:00
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "vault",
|
2026-06-26 16:55:23 -03:00
|
|
|
"writable": true,
|
feat(stablecoin): implement `open_position`
Adds the `open_position` instruction to the Stablecoin Program. The instruction
claims a per-owner `Position` PDA, initializes a collateral vault token holding
via a chained `Token::InitializeAccount` under the vault's PDA authority, and
moves `collateral_amount` from the user's holding into the vault with a chained
`Token::Transfer`. `Position` is persisted with `collateral_amount` and
`debt_amount = 0`; the debt path is deferred to `generate_debt`.
- Add `Position` struct, `OpenPosition` instruction variant, and
`compute_position_pda{,_seed}` / `compute_position_vault_pda{,_seed}` helpers
in `stablecoin_core` with domain-separated PDA seeds.
- Implement `open_position::open_position` mirroring the ATA `create` and AMM
`new_definition` patterns: authorization and uninitialized-state asserts, PDA
verification, and same-transaction chained `InitializeAccount` + `Transfer`.
- Wire the new instruction through the SPEL guest and regenerate the stablecoin
IDL artifact.
- Cover the happy path, all assertion paths, and PDA determinism /
non-collision in 11 new unit tests.
2026-05-11 17:14:27 -03:00
|
|
|
"signer": false,
|
2026-06-26 16:55:23 -03:00
|
|
|
"init": true
|
feat(stablecoin): implement `open_position`
Adds the `open_position` instruction to the Stablecoin Program. The instruction
claims a per-owner `Position` PDA, initializes a collateral vault token holding
via a chained `Token::InitializeAccount` under the vault's PDA authority, and
moves `collateral_amount` from the user's holding into the vault with a chained
`Token::Transfer`. `Position` is persisted with `collateral_amount` and
`debt_amount = 0`; the debt path is deferred to `generate_debt`.
- Add `Position` struct, `OpenPosition` instruction variant, and
`compute_position_pda{,_seed}` / `compute_position_vault_pda{,_seed}` helpers
in `stablecoin_core` with domain-separated PDA seeds.
- Implement `open_position::open_position` mirroring the ATA `create` and AMM
`new_definition` patterns: authorization and uninitialized-state asserts, PDA
verification, and same-transaction chained `InitializeAccount` + `Transfer`.
- Wire the new instruction through the SPEL guest and regenerate the stablecoin
IDL artifact.
- Cover the happy path, all assertion paths, and PDA determinism /
non-collision in 11 new unit tests.
2026-05-11 17:14:27 -03:00
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "user_holding",
|
2026-06-26 16:55:23 -03:00
|
|
|
"writable": true,
|
|
|
|
|
"signer": true,
|
feat(stablecoin): implement `open_position`
Adds the `open_position` instruction to the Stablecoin Program. The instruction
claims a per-owner `Position` PDA, initializes a collateral vault token holding
via a chained `Token::InitializeAccount` under the vault's PDA authority, and
moves `collateral_amount` from the user's holding into the vault with a chained
`Token::Transfer`. `Position` is persisted with `collateral_amount` and
`debt_amount = 0`; the debt path is deferred to `generate_debt`.
- Add `Position` struct, `OpenPosition` instruction variant, and
`compute_position_pda{,_seed}` / `compute_position_vault_pda{,_seed}` helpers
in `stablecoin_core` with domain-separated PDA seeds.
- Implement `open_position::open_position` mirroring the ATA `create` and AMM
`new_definition` patterns: authorization and uninitialized-state asserts, PDA
verification, and same-transaction chained `InitializeAccount` + `Transfer`.
- Wire the new instruction through the SPEL guest and regenerate the stablecoin
IDL artifact.
- Cover the happy path, all assertion paths, and PDA determinism /
non-collision in 11 new unit tests.
2026-05-11 17:14:27 -03:00
|
|
|
"init": false
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "token_definition",
|
|
|
|
|
"writable": false,
|
|
|
|
|
"signer": false,
|
|
|
|
|
"init": false
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"args": [
|
|
|
|
|
{
|
|
|
|
|
"name": "collateral_amount",
|
|
|
|
|
"type": "u128"
|
|
|
|
|
}
|
|
|
|
|
]
|
2026-05-19 15:59:10 +02:00
|
|
|
},
|
2026-05-27 10:05:49 -03:00
|
|
|
{
|
|
|
|
|
"name": "deposit_collateral",
|
|
|
|
|
"accounts": [
|
|
|
|
|
{
|
|
|
|
|
"name": "owner",
|
|
|
|
|
"writable": false,
|
2026-06-01 11:26:15 -03:00
|
|
|
"signer": true,
|
2026-05-27 10:05:49 -03:00
|
|
|
"init": false
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "position",
|
2026-06-01 11:26:15 -03:00
|
|
|
"writable": true,
|
2026-05-27 10:05:49 -03:00
|
|
|
"signer": false,
|
|
|
|
|
"init": false
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "vault",
|
2026-06-01 11:26:15 -03:00
|
|
|
"writable": true,
|
2026-05-27 10:05:49 -03:00
|
|
|
"signer": false,
|
|
|
|
|
"init": false
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "user_holding",
|
2026-06-01 11:26:15 -03:00
|
|
|
"writable": true,
|
|
|
|
|
"signer": true,
|
|
|
|
|
"init": false
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "token_definition",
|
2026-05-27 10:05:49 -03:00
|
|
|
"writable": false,
|
|
|
|
|
"signer": false,
|
|
|
|
|
"init": false
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"args": [
|
|
|
|
|
{
|
|
|
|
|
"name": "amount",
|
|
|
|
|
"type": "u128"
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
},
|
2026-05-19 15:59:10 +02:00
|
|
|
{
|
|
|
|
|
"name": "withdraw_collateral",
|
|
|
|
|
"accounts": [
|
|
|
|
|
{
|
|
|
|
|
"name": "owner",
|
|
|
|
|
"writable": false,
|
2026-06-26 16:55:23 -03:00
|
|
|
"signer": true,
|
2026-05-19 15:59:10 +02:00
|
|
|
"init": false
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "position",
|
2026-06-26 16:55:23 -03:00
|
|
|
"writable": true,
|
2026-05-19 15:59:10 +02:00
|
|
|
"signer": false,
|
|
|
|
|
"init": false
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "vault",
|
2026-06-26 16:55:23 -03:00
|
|
|
"writable": true,
|
2026-05-19 15:59:10 +02:00
|
|
|
"signer": false,
|
|
|
|
|
"init": false
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "destination",
|
2026-06-26 16:55:23 -03:00
|
|
|
"writable": true,
|
2026-05-19 15:59:10 +02:00
|
|
|
"signer": false,
|
|
|
|
|
"init": false
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"args": [
|
|
|
|
|
{
|
|
|
|
|
"name": "amount",
|
|
|
|
|
"type": "u128"
|
|
|
|
|
}
|
|
|
|
|
]
|
2026-05-22 11:09:16 +02:00
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "repay_debt",
|
|
|
|
|
"accounts": [
|
|
|
|
|
{
|
|
|
|
|
"name": "owner",
|
|
|
|
|
"writable": false,
|
2026-06-26 16:55:23 -03:00
|
|
|
"signer": true,
|
2026-05-22 11:09:16 +02:00
|
|
|
"init": false
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "position",
|
2026-06-26 16:55:23 -03:00
|
|
|
"writable": true,
|
2026-05-22 11:09:16 +02:00
|
|
|
"signer": false,
|
|
|
|
|
"init": false
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "stablecoin_definition",
|
2026-06-26 16:55:23 -03:00
|
|
|
"writable": true,
|
2026-05-22 11:09:16 +02:00
|
|
|
"signer": false,
|
|
|
|
|
"init": false
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "user_stablecoin_holding",
|
2026-06-26 16:55:23 -03:00
|
|
|
"writable": true,
|
|
|
|
|
"signer": true,
|
2026-05-22 11:09:16 +02:00
|
|
|
"init": false
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"args": [
|
|
|
|
|
{
|
|
|
|
|
"name": "amount",
|
|
|
|
|
"type": "u128"
|
|
|
|
|
}
|
|
|
|
|
]
|
2026-05-11 14:51:50 +02:00
|
|
|
}
|
|
|
|
|
],
|
2026-05-12 13:04:59 -03:00
|
|
|
"accounts": [
|
|
|
|
|
{
|
|
|
|
|
"name": "Position",
|
|
|
|
|
"type": {
|
|
|
|
|
"kind": "struct",
|
|
|
|
|
"fields": [
|
|
|
|
|
{
|
|
|
|
|
"name": "collateral_vault_id",
|
|
|
|
|
"type": "account_id"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "collateral_definition_id",
|
|
|
|
|
"type": "account_id"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "collateral_amount",
|
|
|
|
|
"type": "u128"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "debt_amount",
|
|
|
|
|
"type": "u128"
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "TokenDefinition",
|
|
|
|
|
"type": {
|
|
|
|
|
"kind": "enum",
|
|
|
|
|
"variants": [
|
|
|
|
|
{
|
|
|
|
|
"name": "Fungible",
|
|
|
|
|
"fields": [
|
|
|
|
|
{
|
|
|
|
|
"name": "name",
|
|
|
|
|
"type": "string"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "total_supply",
|
|
|
|
|
"type": "u128"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "metadata_id",
|
|
|
|
|
"type": {
|
|
|
|
|
"option": "account_id"
|
|
|
|
|
}
|
feat(token): add mint authority model to token program
Add an optional mint authority to fungible tokens for controlled supply:
create with a designated minter, mint additional supply, rotate the
authority to a new key, or permanently revoke it to fix the supply.
The authority is stored inline on `TokenDefinition::Fungible` as
`authority: Option<AccountId>` (`Some(id)` = mintable by `id`, `None` =
fixed supply). Keeping it a plain `Option<AccountId>` rather than a custom
wrapper type leaves account state decodable by `spel inspect`; the
require/rotate/revoke guard logic lives inline in the handlers.
LEZ rejects a transaction that lists the same account id twice, so one
instruction cannot statically express both "the definition account is the
authority and signs" (self/PDA authority) and "a distinct rotated account
signs" (external authority) — they need opposite signer markers. Each
privileged operation is therefore split into a self and an external
variant:
- `Mint` / `SetAuthority` — the definition account is the signer.
- `MintWithAuthority` / `SetAuthorityWithAuthority` — a distinct authority
account is the signer; the definition account does not sign.
Creation via `NewFungibleDefinition { mint_authority, .. }`; an all-zero
authority id is rejected. The AMM's LP token uses self/PDA authority — its
stored authority is the LP definition PDA, minted only by the pool via
chained calls.
Covered by token unit tests and zkVM integration tests: creation with and
without an authority, self- and external-authority mint, rotation, and
external rotate/revoke. IDLs regenerated.
2026-05-27 15:04:28 +05:30
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "authority",
|
|
|
|
|
"type": {
|
|
|
|
|
"option": "account_id"
|
|
|
|
|
}
|
2026-05-12 13:04:59 -03:00
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "NonFungible",
|
|
|
|
|
"fields": [
|
|
|
|
|
{
|
|
|
|
|
"name": "name",
|
|
|
|
|
"type": "string"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "printable_supply",
|
|
|
|
|
"type": "u128"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "metadata_id",
|
|
|
|
|
"type": "account_id"
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "TokenHolding",
|
|
|
|
|
"type": {
|
|
|
|
|
"kind": "enum",
|
|
|
|
|
"variants": [
|
|
|
|
|
{
|
|
|
|
|
"name": "Fungible",
|
|
|
|
|
"fields": [
|
|
|
|
|
{
|
|
|
|
|
"name": "definition_id",
|
|
|
|
|
"type": "account_id"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "balance",
|
|
|
|
|
"type": "u128"
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "NftMaster",
|
|
|
|
|
"fields": [
|
|
|
|
|
{
|
|
|
|
|
"name": "definition_id",
|
|
|
|
|
"type": "account_id"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "print_balance",
|
|
|
|
|
"type": "u128"
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "NftPrintedCopy",
|
|
|
|
|
"fields": [
|
|
|
|
|
{
|
|
|
|
|
"name": "definition_id",
|
|
|
|
|
"type": "account_id"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "owned",
|
|
|
|
|
"type": "bool"
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "TokenMetadata",
|
|
|
|
|
"type": {
|
|
|
|
|
"kind": "struct",
|
|
|
|
|
"fields": [
|
|
|
|
|
{
|
|
|
|
|
"name": "definition_id",
|
|
|
|
|
"type": "account_id"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "standard",
|
|
|
|
|
"type": {
|
|
|
|
|
"defined": "MetadataStandard"
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "uri",
|
|
|
|
|
"type": "string"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "creators",
|
|
|
|
|
"type": "string"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "primary_sale_date",
|
|
|
|
|
"type": "u64"
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
2026-05-14 00:20:14 -03:00
|
|
|
},
|
2026-05-28 10:35:05 +02:00
|
|
|
{
|
|
|
|
|
"name": "PriceObservations",
|
|
|
|
|
"type": {
|
|
|
|
|
"kind": "struct",
|
|
|
|
|
"fields": [
|
|
|
|
|
{
|
|
|
|
|
"name": "price_source_id",
|
|
|
|
|
"type": "account_id"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "write_index",
|
|
|
|
|
"type": "u32"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "total_entries",
|
|
|
|
|
"type": "u64"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "last_recorded_tick",
|
|
|
|
|
"type": "i32"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "entries",
|
|
|
|
|
"type": {
|
|
|
|
|
"vec": {
|
|
|
|
|
"defined": "ObservationEntry"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
},
|
2026-05-14 00:20:14 -03:00
|
|
|
{
|
|
|
|
|
"name": "OraclePriceAccount",
|
|
|
|
|
"type": {
|
|
|
|
|
"kind": "struct",
|
|
|
|
|
"fields": [
|
|
|
|
|
{
|
|
|
|
|
"name": "base_asset",
|
|
|
|
|
"type": "account_id"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "quote_asset",
|
|
|
|
|
"type": "account_id"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "price",
|
|
|
|
|
"type": "u128"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "timestamp",
|
|
|
|
|
"type": "u64"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "source_id",
|
2026-05-28 20:42:59 +02:00
|
|
|
"type": "account_id"
|
2026-05-14 00:20:14 -03:00
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "confidence_interval",
|
|
|
|
|
"type": "u128"
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
2026-05-29 11:02:01 +02:00
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "CurrentTickAccount",
|
|
|
|
|
"type": {
|
|
|
|
|
"kind": "struct",
|
|
|
|
|
"fields": [
|
|
|
|
|
{
|
|
|
|
|
"name": "tick",
|
|
|
|
|
"type": "i32"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "last_updated",
|
|
|
|
|
"type": "u64"
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
2026-05-12 13:04:59 -03:00
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"types": [
|
|
|
|
|
{
|
2026-06-16 10:22:10 +02:00
|
|
|
"name": "MetadataStandard",
|
|
|
|
|
"kind": "enum",
|
|
|
|
|
"variants": [
|
2026-05-12 13:04:59 -03:00
|
|
|
{
|
2026-06-16 10:22:10 +02:00
|
|
|
"name": "Simple"
|
2026-05-12 13:04:59 -03:00
|
|
|
},
|
|
|
|
|
{
|
2026-06-16 10:22:10 +02:00
|
|
|
"name": "Expanded"
|
2026-05-12 13:04:59 -03:00
|
|
|
}
|
|
|
|
|
]
|
2026-05-28 20:42:59 +02:00
|
|
|
},
|
|
|
|
|
{
|
2026-06-16 10:22:10 +02:00
|
|
|
"name": "ObservationEntry",
|
|
|
|
|
"kind": "struct",
|
|
|
|
|
"fields": [
|
2026-05-28 20:42:59 +02:00
|
|
|
{
|
2026-06-16 10:22:10 +02:00
|
|
|
"name": "timestamp",
|
|
|
|
|
"type": "u64"
|
2026-05-28 20:42:59 +02:00
|
|
|
},
|
|
|
|
|
{
|
2026-06-16 10:22:10 +02:00
|
|
|
"name": "tick_cumulative",
|
|
|
|
|
"type": "i64"
|
2026-05-28 20:42:59 +02:00
|
|
|
}
|
|
|
|
|
]
|
2026-05-12 13:04:59 -03:00
|
|
|
}
|
|
|
|
|
],
|
2026-05-11 14:51:50 +02:00
|
|
|
"instruction_type": "stablecoin_core::Instruction"
|
|
|
|
|
}
|