feat: add support for getTransaction RPC method#68
Conversation
gregorydemay
left a comment
There was a problem hiding this comment.
Thanks a lot @lpahlavi for pushing through this!
canister/sol_rpc_canister.did
Outdated
There was a problem hiding this comment.
nit: Similarly to Pubkey, let's use a type alias for Signature.
There was a problem hiding this comment.
Good idea! Done.
I had a quick look if there would be any other sensible aliases and I also added a Blockhash one.
canister/src/rpc_client/mod.rs
Outdated
There was a problem hiding this comment.
That's currently not enough, e.g. tspfR5p1PFphquz4WzDb7qM4UhJdgQXkEZtW88BykVEdX2zL2kBT9kidwQBviKwQuA3b6GMCR1gknHvzQ3r623T in base64 is like 6.3 kB. Let's put 10 kB there.
| >; | ||
|
|
||
| impl GetTransactionRequest { | ||
| pub fn get_transaction<Params: Into<json::GetTransactionParams>>( |
There was a problem hiding this comment.
I think we have a problem with dRPC:
dfx canister call --ic sol_rpc --wallet $(dfx identity get-wallet --ic) --with-cycles 10B getTransaction '(
variant { Default = variant { Mainnet } },
null,
record {
signature = "tspfR5p1PFphquz4WzDb7qM4UhJdgQXkEZtW88BykVEdX2zL2kBT9kidwQBviKwQuA3b6GMCR1gknHvzQ3r623T";
maxSupportedTransactionVersion = opt (0 : nat8);
encoding = opt variant { base64 };
commitment = null;
},
)
returns something like Inconsistent where
record {
variant { Supported = variant { DrpcMainnet } };
variant { Ok = null };
};
which I can reproduce locally via curl
curl --location 'https://lb.drpc.org/ogrpc?network=solana&dkey=API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"id": 1,
"method": "getTransaction",
"params": [
"tspfR5p1PFphquz4WzDb7qM4UhJdgQXkEZtW88BykVEdX2zL2kBT9kidwQBviKwQuA3b6GMCR1gknHvzQ3r623T",
{
"encoding":"base64",
"maxSupportedTransactionVersion":0
}
]
}'
So apparently dRPC does not have archive nodes for Solana 😭 (https://drpc.org/docs/archive-nodes)
There was a problem hiding this comment.
Ah that is indeed quite sad... After a very quick search through the docs on the dRPC website, I couldn't find how long they keep blocks before discarding them but it seems like a standard for Solana might be around 1.5-3hrs. For the end-to-end tests this shouldn't be a problem since we fetch a recent transaction (i.e. the first signature from the most recent finalized block), but I guess we should maybe look into an alternative provider, or potentially warn users about it... WDYT?
| /// implies that account locks are not taken for this TX, and should | ||
| /// not be unlocked. | ||
| SanitizeFailure, | ||
| // TODO XC-293 |
There was a problem hiding this comment.
nit: TODO. I see the Solana crate doesn't have Rust docs for that variant.
lpahlavi
left a comment
There was a problem hiding this comment.
Thanks a lot for your feedback @gregorydemay! I've addressed your feedback, LMKWYT!
canister/sol_rpc_canister.did
Outdated
There was a problem hiding this comment.
Good idea! Done.
I had a quick look if there would be any other sensible aliases and I also added a Blockhash one.
| >; | ||
|
|
||
| impl GetTransactionRequest { | ||
| pub fn get_transaction<Params: Into<json::GetTransactionParams>>( |
There was a problem hiding this comment.
Ah that is indeed quite sad... After a very quick search through the docs on the dRPC website, I couldn't find how long they keep blocks before discarding them but it seems like a standard for Solana might be around 1.5-3hrs. For the end-to-end tests this shouldn't be a problem since we fetch a recent transaction (i.e. the first signature from the most recent finalized block), but I guess we should maybe look into an alternative provider, or potentially warn users about it... WDYT?
gregorydemay
left a comment
There was a problem hiding this comment.
Mostly some minor comments
| Inconsistent : vec record { RpcSource; GetBlockResult }; | ||
| }; | ||
|
|
||
| // TODO XC-293: Format and add documentation |
lpahlavi
left a comment
There was a problem hiding this comment.
@gregorydemay @ninegua Thanks a lot for your detailed reviews and feedback despite the size of the PR! I've addressed your feedback, PTAL.
canister/sol_rpc_canister.did
Outdated
There was a problem hiding this comment.
Ah good point, I almost forgot.
I didn't rename enum variants for the new types, I don't think this should be necessary. WDYT?
(XC-293) Add Rustdoc for all new types introduced in relation to the Solana `getTransaction` RPC call in [this PR](#68).
## 🤖 New release * `sol_rpc_types`: 0.1.0 * `sol_rpc_canister`: 0.1.0 * `sol_rpc_client`: 0.1.0 <details><summary><i><b>Changelog</b></i></summary><p> ## `sol_rpc_types` <blockquote> ## [0.1.0] - 2025-04-29 ### Added - Add Rustdoc for types related to `getTransaction` ([#71](#71)) - Add support for `getTransaction` RPC method ([#68](#68)) - Add `getBlock` RPC method ([#53](#53)) - Add `sendTransaction` RPC method ([#59](#59)) - Add NOTICE to Apache license ([#60](#60)) - Add `getAccountInfo` RPC method ([#49](#49)) - Add metrics ([#41](#41)) - Add logging crate ([#13](#13)) - Add doc build stage to CI ([#19](#19)) - Add support for override providers ([#12](#12)) ### Changed - Use `canlog_derive` and `canlog` from crates.io ([#84](#84)) - Release pipeline ([#4](#4)) - Default commitment level for `SolRpcClient` ([#77](#77)) - Support method `getBalance` ([#74](#74)) - Rename some enum variants to camel case when serializing ([#72](#72)) - Use SOL RPC canister in `basic_solana` example ([#69](#69)) - Add basic README instructions ([#63](#63)) - Cycles cost ([#52](#52)) - Client builder ([#54](#54)) - Round result from `getSlot` RPC method ([#48](#48)) - Use `canhttp` `multi` feature ([#46](#46)) - Implement getSlot RPC method ([#33](#33)) - Add some tested RPC providers for Solana Mainnet and Devnet ([#15](#15)) - Streamline providers ([#32](#32)) - Add support for API keys ([#10](#10)) - Hard-code SOL RPC providers ([#9](#9)) - Basic Solana wallet example ([#1](#1)) - Initial cargo workspace and build pipeline ([#2](#2)) ### Fixed - Correct Solana cluster for dRPC and Helius providers ([#47](#47)) <!-- generated by git-cliff --> Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). </blockquote> ## `sol_rpc_canister` <blockquote> ## [0.1.0] - 2025-04-29 ### Added - Add support for `getTransaction` RPC method ([#68](#68)) - Add `getBlock` RPC method ([#53](#53)) - Add `sendTransaction` RPC method ([#59](#59)) - Add NOTICE to Apache license ([#60](#60)) - Add `getAccountInfo` RPC method ([#49](#49)) - Add metrics ([#41](#41)) - Add logging crate ([#13](#13)) - Add support for override providers ([#12](#12)) ### Changed - Use `canlog_derive` and `canlog` from crates.io ([#84](#84)) - Release pipeline ([#4](#4)) - Clean-up TODOs ([#81](#81)) - Support method `getBalance` ([#74](#74)) - Remove http_types module and use external ic-http-types crate ([#73](#73)) - Rename some enum variants to camel case when serializing ([#72](#72)) - Use constant size JSON-RPC request ID ([#62](#62)) - Use method from JSON-RPC request for metric ([#61](#61)) - Cycles cost ([#52](#52)) - Client builder ([#54](#54)) - Round result from `getSlot` RPC method ([#48](#48)) - Use `canhttp` `multi` feature ([#46](#46)) - Implement a method for making generic RPC request ([#39](#39)) - Implement getSlot RPC method ([#33](#33)) - Add some tested RPC providers for Solana Mainnet and Devnet ([#15](#15)) - Streamline providers ([#32](#32)) - Update rust toolchain to 1.85 ([#21](#21)) - Remove unnecessary Storable implementations ([#14](#14)) - Add support for API keys ([#10](#10)) - Hard-code SOL RPC providers ([#9](#9)) - Reproducible build ([#3](#3)) - Initial cargo workspace and build pipeline ([#2](#2)) ### Fixed - Set `maxSupportedTransactionVersion` to zero for end-to-end tests ([#85](#85)) - API keys ([#58](#58)) - End-to-end tests ([#45](#45)) - Correct Solana cluster for dRPC and Helius providers ([#47](#47)) - E2e test with Solana test validator ([#20](#20)) - Create test canister on ICP mainnet ([#8](#8)) <!-- generated by git-cliff --> Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). </blockquote> ## `sol_rpc_client` <blockquote> ## [0.1.0] - 2025-04-29 ### Added - Add support for `getTransaction` RPC method ([#68](#68)) - Add `getBlock` RPC method ([#53](#53)) - Add `sendTransaction` RPC method ([#59](#59)) - Add NOTICE to Apache license ([#60](#60)) - Add `getAccountInfo` RPC method ([#49](#49)) ### Changed - Release pipeline ([#4](#4)) - Default commitment level for `SolRpcClient` ([#77](#77)) - Support method `getBalance` ([#74](#74)) - Use SOL RPC canister in `basic_solana` example ([#69](#69)) - Rust documentation tests for the `SolRpcClient` ([#65](#65)) - Add basic README instructions ([#63](#63)) - Cycles cost ([#52](#52)) - Client builder ([#54](#54)) - Round result from `getSlot` RPC method ([#48](#48)) - Use `canhttp` `multi` feature ([#46](#46)) - Implement a method for making generic RPC request ([#39](#39)) - Implement getSlot RPC method ([#33](#33)) - Streamline providers ([#32](#32)) - Add support for API keys ([#10](#10)) - Hard-code SOL RPC providers ([#9](#9)) - Initial cargo workspace and build pipeline ([#2](#2)) ### Fixed - Forward calls through wallet canister ([#40](#40)) - E2e test with Solana test validator ([#20](#20)) <!-- generated by git-cliff --> Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). </blockquote> </p></details> --- This PR was generated with [release-plz](https://github.com/release-plz/release-plz/). --------- Co-authored-by: gregorydemay <gregory.demay@dfinity.org> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
## 🤖 New release * `sol_rpc_canister`: 0.2.0 <details><summary><i><b>Changelog</b></i></summary><p> <blockquote> ## [0.2.0] - 2025-05-27 ### Added - Add client method to sign a transaction ([#113](#113)) - Add Chainstack RPC provider ([#118](#118)) - Add support for `getSignaturesForAddress` ([#106](#106)) - Add support for `getSignatureStatuses` RPC method ([#96](#96)) - Add support for `getTokenAccountBalance` RPC method ([#90](#90)) - Add support for `getTransaction` RPC method ([#68](#68)) - Add `getBlock` RPC method ([#53](#53)) - Add `sendTransaction` RPC method ([#59](#59)) - Add NOTICE to Apache license ([#60](#60)) - Add `getAccountInfo` RPC method ([#49](#49)) - Add metrics ([#41](#41)) - Add logging crate ([#13](#13)) - Add support for override providers ([#12](#12)) ### Changed - Bump version to 0.2 - Candid NonZeroU8 ([#108](#108)) - Add `RoundingError` to `sol_rpc_types` ([#105](#105)) - Use secure primitive types for `Pubkey`, `Signature` and `Hash` ([#98](#98)) - Add support for `getRecentPrioritizationFees` ([#92](#92)) - Simplify API keys provisioning script ([#89](#89)) - Release v0.1.0 ([#88](#88)) - Use `canlog_derive` and `canlog` from crates.io ([#84](#84)) - Release pipeline ([#4](#4)) - Clean-up TODOs ([#81](#81)) - Support method `getBalance` ([#74](#74)) - Remove http_types module and use external ic-http-types crate ([#73](#73)) - Rename some enum variants to camel case when serializing ([#72](#72)) - Use constant size JSON-RPC request ID ([#62](#62)) - Use method from JSON-RPC request for metric ([#61](#61)) - Cycles cost ([#52](#52)) - Client builder ([#54](#54)) - Round result from `getSlot` RPC method ([#48](#48)) - Use `canhttp` `multi` feature ([#46](#46)) - Implement a method for making generic RPC request ([#39](#39)) - Implement getSlot RPC method ([#33](#33)) - Add some tested RPC providers for Solana Mainnet and Devnet ([#15](#15)) - Streamline providers ([#32](#32)) - Update rust toolchain to 1.85 ([#21](#21)) - Remove unnecessary Storable implementations ([#14](#14)) - Add support for API keys ([#10](#10)) - Hard-code SOL RPC providers ([#9](#9)) - Reproducible build ([#3](#3)) - Initial cargo workspace and build pipeline ([#2](#2)) ### Fixed - Missing `TraceHttp` logs ([#129](#129)) - End-to-end tests for `sendTransaction` ([#104](#104)) - Unit test for `getRecentPrioritizationFees` parameters serialization ([#107](#107)) - Integration test for `verifyApiKey` ([#82](#82)) - Set `maxSupportedTransactionVersion` to zero for end-to-end tests ([#85](#85)) - API keys ([#58](#58)) - End-to-end tests ([#45](#45)) - Correct Solana cluster for dRPC and Helius providers ([#47](#47)) - E2e test with Solana test validator ([#20](#20)) - Create test canister on ICP mainnet ([#8](#8)) ### Removed - Remove default/non-default providers ([#122](#122)) </blockquote> </p></details> --- This PR was generated with [release-plz](https://github.com/release-plz/release-plz/). --------- Co-authored-by: gregorydemay <gregory.demay@dfinity.org> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
## 🤖 New release * `sol_rpc_canister`: 1.0.0 <details><summary><i><b>Changelog</b></i></summary><p> <blockquote> ## [1.0.0] - 2025-06-12 ### Added - Add support for `transactionDetails=accounts` ([#139](#139)) - Add support for `rewards` parameter for `getBlock` ([#135](#135)) - Add helper methods for request builders ([#136](#136)) - Add client method to sign a transaction ([#113](#113)) - Add Chainstack RPC provider ([#118](#118)) - Add support for `getSignaturesForAddress` ([#106](#106)) - Add support for `getSignatureStatuses` RPC method ([#96](#96)) - Add support for `getTokenAccountBalance` RPC method ([#90](#90)) - Add support for `getTransaction` RPC method ([#68](#68)) - Add `getBlock` RPC method ([#53](#53)) - Add `sendTransaction` RPC method ([#59](#59)) - Add NOTICE to Apache license ([#60](#60)) - Add `getAccountInfo` RPC method ([#49](#49)) - Add metrics ([#41](#41)) - Add logging crate ([#13](#13)) - Add support for override providers ([#12](#12)) ### Changed - Bump to 1.0.0 - Inline request parameters `is_default_config` methods ([#138](#138)) - Release v0.2.0 ([#131](#131)) - Bump version and use a release notes template ([#130](#130)) - Candid NonZeroU8 ([#108](#108)) - Add `RoundingError` to `sol_rpc_types` ([#105](#105)) - Use secure primitive types for `Pubkey`, `Signature` and `Hash` ([#98](#98)) - Add support for `getRecentPrioritizationFees` ([#92](#92)) - Simplify API keys provisioning script ([#89](#89)) - Release v0.1.0 ([#88](#88)) - Use `canlog_derive` and `canlog` from crates.io ([#84](#84)) - Release pipeline ([#4](#4)) - Clean-up TODOs ([#81](#81)) - Support method `getBalance` ([#74](#74)) - Remove http_types module and use external ic-http-types crate ([#73](#73)) - Rename some enum variants to camel case when serializing ([#72](#72)) - Use constant size JSON-RPC request ID ([#62](#62)) - Use method from JSON-RPC request for metric ([#61](#61)) - Cycles cost ([#52](#52)) - Client builder ([#54](#54)) - Round result from `getSlot` RPC method ([#48](#48)) - Use `canhttp` `multi` feature ([#46](#46)) - Implement a method for making generic RPC request ([#39](#39)) - Implement getSlot RPC method ([#33](#33)) - Add some tested RPC providers for Solana Mainnet and Devnet ([#15](#15)) - Streamline providers ([#32](#32)) - Update rust toolchain to 1.85 ([#21](#21)) - Remove unnecessary Storable implementations ([#14](#14)) - Add support for API keys ([#10](#10)) - Hard-code SOL RPC providers ([#9](#9)) - Reproducible build ([#3](#3)) - Initial cargo workspace and build pipeline ([#2](#2)) ### Fixed - Missing `TraceHttp` logs ([#129](#129)) - End-to-end tests for `sendTransaction` ([#104](#104)) - Unit test for `getRecentPrioritizationFees` parameters serialization ([#107](#107)) - Integration test for `verifyApiKey` ([#82](#82)) - Set `maxSupportedTransactionVersion` to zero for end-to-end tests ([#85](#85)) - API keys ([#58](#58)) - End-to-end tests ([#45](#45)) - Correct Solana cluster for dRPC and Helius providers ([#47](#47)) - E2e test with Solana test validator ([#20](#20)) - Create test canister on ICP mainnet ([#8](#8)) ### Removed - Remove default/non-default providers ([#122](#122)) </blockquote> </p></details> --- This PR was generated with [release-plz](https://github.com/release-plz/release-plz/). --------- Co-authored-by: gregorydemay <gregory.demay@dfinity.org> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: gregorydemay <112856886+gregorydemay@users.noreply.github.com>
(XC-293) Add support for
getTransactionSolana RPC method.