@chainlink/cre-sdk 1.14.0-solana-alpha-1 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -60
- package/dist/generated/capabilities/blockchain/evm/v1alpha/client_pb.js +1 -1
- package/dist/generated/chain-selectors/mainnet/evm/dtcc-mainnet-appchain.d.ts +3 -0
- package/dist/generated/chain-selectors/mainnet/evm/dtcc-mainnet-appchain.js +12 -0
- package/dist/generated/chain-selectors/testnet/evm/private-testnet-quartzite.d.ts +3 -0
- package/dist/generated/chain-selectors/testnet/evm/private-testnet-quartzite.js +12 -0
- package/dist/generated/networks.d.ts +2 -2
- package/dist/generated/networks.js +14 -0
- package/dist/generated-sdk/capabilities/blockchain/evm/v1alpha/client_sdk_gen.d.ts +1 -0
- package/dist/generated-sdk/capabilities/blockchain/evm/v1alpha/client_sdk_gen.js +1 -0
- package/dist/sdk/test/evm-contract-mock.js +58 -60
- package/dist/sdk/test/index.d.ts +0 -1
- package/dist/sdk/test/index.js +0 -1
- package/dist/sdk/utils/capabilities/blockchain/{evm/evm-helpers.d.ts → blockchain-helpers.d.ts} +6 -7
- package/dist/sdk/utils/capabilities/blockchain/{evm/evm-helpers.js → blockchain-helpers.js} +8 -6
- package/dist/sdk/utils/hex-utils.d.ts +0 -6
- package/dist/sdk/utils/hex-utils.js +0 -8
- package/dist/sdk/utils/index.d.ts +1 -3
- package/dist/sdk/utils/index.js +1 -2
- package/package.json +3 -6
- package/dist/sdk/test/contract-mock-core.d.ts +0 -16
- package/dist/sdk/test/contract-mock-core.js +0 -21
- package/dist/sdk/test/solana-contract-mock.d.ts +0 -54
- package/dist/sdk/test/solana-contract-mock.js +0 -63
- package/dist/sdk/utils/capabilities/blockchain/report-helpers.d.ts +0 -19
- package/dist/sdk/utils/capabilities/blockchain/report-helpers.js +0 -16
- package/dist/sdk/utils/capabilities/blockchain/solana/solana-helpers.d.ts +0 -101
- package/dist/sdk/utils/capabilities/blockchain/solana/solana-helpers.js +0 -100
package/README.md
CHANGED
|
@@ -237,66 +237,6 @@ const onCronTrigger = (runtime: Runtime<Config>) => {
|
|
|
237
237
|
};
|
|
238
238
|
```
|
|
239
239
|
|
|
240
|
-
### Solana Write Reports
|
|
241
|
-
|
|
242
|
-
The Solana capability is **write-only**: reports are delivered through the
|
|
243
|
-
keystone-forwarder to a receiver program's `on_report` entrypoint as a bare
|
|
244
|
-
Borsh-encoded struct. The SDK ships the write plumbing under
|
|
245
|
-
`utils/capabilities/blockchain/solana`:
|
|
246
|
-
|
|
247
|
-
- `calculateAccountsHash(accounts)` — sha256 of the concatenated account
|
|
248
|
-
public keys (the forwarder's on-chain account verification),
|
|
249
|
-
- `encodeForwarderReport({ accountHash, payload })` — the
|
|
250
|
-
`[32-byte hash][u32-LE len][payload]` forwarder envelope,
|
|
251
|
-
- `encodeBorshVecU32(elements)` — Borsh `Vec` of pre-encoded elements,
|
|
252
|
-
- `prepareSolanaReportRequest(payload)` — report request with the Solana
|
|
253
|
-
encoder (`solana`/`ecdsa`/`keccak256`),
|
|
254
|
-
- `solanaAccountMeta(publicKey, isWritable)` / `solanaAddressToBytes(base58)`.
|
|
255
|
-
|
|
256
|
-
The wire format is byte-identical to the Go SDK's
|
|
257
|
-
`capabilities/blockchain/solana/bindings` package.
|
|
258
|
-
|
|
259
|
-
Generate typed per-program bindings from an Anchor IDL with the CRE CLI:
|
|
260
|
-
|
|
261
|
-
```bash
|
|
262
|
-
cre generate-bindings solana --language typescript
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
```typescript
|
|
266
|
-
import { cre, type Runtime, solanaAccountMeta, SolanaClient } from "@chainlink/cre-sdk";
|
|
267
|
-
import { DataStorage } from "../contracts/solana/ts/generated";
|
|
268
|
-
|
|
269
|
-
const onTrigger = (runtime: Runtime<Config>) => {
|
|
270
|
-
const client = new SolanaClient(SolanaClient.SUPPORTED_CHAIN_SELECTORS["solana-devnet"]);
|
|
271
|
-
const dataStorage = new DataStorage(client); // program ID baked in from the IDL
|
|
272
|
-
|
|
273
|
-
// remainingAccounts: forwarderState, forwarderAuthority PDA, then receiver accounts
|
|
274
|
-
const remainingAccounts = [
|
|
275
|
-
solanaAccountMeta(forwarderState),
|
|
276
|
-
solanaAccountMeta(forwarderAuthority),
|
|
277
|
-
solanaAccountMeta(receiverDataAccount, true),
|
|
278
|
-
];
|
|
279
|
-
|
|
280
|
-
const reply = dataStorage.writeReportFromUserData(
|
|
281
|
-
runtime,
|
|
282
|
-
{ key: "answer", value: "42" },
|
|
283
|
-
remainingAccounts,
|
|
284
|
-
);
|
|
285
|
-
runtime.log(`tx status: ${reply.txStatus}`);
|
|
286
|
-
};
|
|
287
|
-
```
|
|
288
|
-
|
|
289
|
-
In tests, intercept writes with the generated mock:
|
|
290
|
-
|
|
291
|
-
```typescript
|
|
292
|
-
import { SolanaMock } from "@chainlink/cre-sdk/test";
|
|
293
|
-
import { newDataStorageMock } from "../contracts/solana/ts/generated";
|
|
294
|
-
|
|
295
|
-
const solanaMock = SolanaMock.testInstance(chainSelector);
|
|
296
|
-
const dataStorage = newDataStorageMock(solanaMock);
|
|
297
|
-
dataStorage.writeReport = ({ report }) => ({ txStatus: "TX_STATUS_SUCCESS" });
|
|
298
|
-
```
|
|
299
|
-
|
|
300
240
|
## Configuration & Type Safety
|
|
301
241
|
|
|
302
242
|
You, the developer, must declare config files in config.json files, co-located with your TypeScript workflow definition.
|
|
@@ -10,7 +10,7 @@ import { file_values_v1_values } from '../../../../values/v1/values_pb';
|
|
|
10
10
|
*/
|
|
11
11
|
export const file_capabilities_blockchain_evm_v1alpha_client =
|
|
12
12
|
/*@__PURE__*/
|
|
13
|
-
fileDesc('
|
|
13
|
+
fileDesc('CjBjYXBhYmlsaXRpZXMvYmxvY2tjaGFpbi9ldm0vdjFhbHBoYS9jbGllbnQucHJvdG8SI2NhcGFiaWxpdGllcy5ibG9ja2NoYWluLmV2bS52MWFscGhhIh0KC1RvcGljVmFsdWVzEg4KBnZhbHVlcxgBIAMoDCK4AQoXRmlsdGVyTG9nVHJpZ2dlclJlcXVlc3QSEQoJYWRkcmVzc2VzGAEgAygMEkAKBnRvcGljcxgCIAMoCzIwLmNhcGFiaWxpdGllcy5ibG9ja2NoYWluLmV2bS52MWFscGhhLlRvcGljVmFsdWVzEkgKCmNvbmZpZGVuY2UYAyABKA4yNC5jYXBhYmlsaXRpZXMuYmxvY2tjaGFpbi5ldm0udjFhbHBoYS5Db25maWRlbmNlTGV2ZWwiegoTQ2FsbENvbnRyYWN0UmVxdWVzdBI6CgRjYWxsGAEgASgLMiwuY2FwYWJpbGl0aWVzLmJsb2NrY2hhaW4uZXZtLnYxYWxwaGEuQ2FsbE1zZxInCgxibG9ja19udW1iZXIYAiABKAsyES52YWx1ZXMudjEuQmlnSW50IiEKEUNhbGxDb250cmFjdFJlcGx5EgwKBGRhdGEYASABKAwiWwoRRmlsdGVyTG9nc1JlcXVlc3QSRgoMZmlsdGVyX3F1ZXJ5GAEgASgLMjAuY2FwYWJpbGl0aWVzLmJsb2NrY2hhaW4uZXZtLnYxYWxwaGEuRmlsdGVyUXVlcnkiSQoPRmlsdGVyTG9nc1JlcGx5EjYKBGxvZ3MYASADKAsyKC5jYXBhYmlsaXRpZXMuYmxvY2tjaGFpbi5ldm0udjFhbHBoYS5Mb2cixwEKA0xvZxIPCgdhZGRyZXNzGAEgASgMEg4KBnRvcGljcxgCIAMoDBIPCgd0eF9oYXNoGAMgASgMEhIKCmJsb2NrX2hhc2gYBCABKAwSDAoEZGF0YRgFIAEoDBIRCglldmVudF9zaWcYBiABKAwSJwoMYmxvY2tfbnVtYmVyGAcgASgLMhEudmFsdWVzLnYxLkJpZ0ludBIQCgh0eF9pbmRleBgIIAEoDRINCgVpbmRleBgJIAEoDRIPCgdyZW1vdmVkGAogASgIIjEKB0NhbGxNc2cSDAoEZnJvbRgBIAEoDBIKCgJ0bxgCIAEoDBIMCgRkYXRhGAMgASgMIr0BCgtGaWx0ZXJRdWVyeRISCgpibG9ja19oYXNoGAEgASgMEiUKCmZyb21fYmxvY2sYAiABKAsyES52YWx1ZXMudjEuQmlnSW50EiMKCHRvX2Jsb2NrGAMgASgLMhEudmFsdWVzLnYxLkJpZ0ludBIRCglhZGRyZXNzZXMYBCADKAwSOwoGdG9waWNzGAUgAygLMisuY2FwYWJpbGl0aWVzLmJsb2NrY2hhaW4uZXZtLnYxYWxwaGEuVG9waWNzIhcKBlRvcGljcxINCgV0b3BpYxgBIAMoDCJMChBCYWxhbmNlQXRSZXF1ZXN0Eg8KB2FjY291bnQYASABKAwSJwoMYmxvY2tfbnVtYmVyGAIgASgLMhEudmFsdWVzLnYxLkJpZ0ludCI0Cg5CYWxhbmNlQXRSZXBseRIiCgdiYWxhbmNlGAEgASgLMhEudmFsdWVzLnYxLkJpZ0ludCJPChJFc3RpbWF0ZUdhc1JlcXVlc3QSOQoDbXNnGAEgASgLMiwuY2FwYWJpbGl0aWVzLmJsb2NrY2hhaW4uZXZtLnYxYWxwaGEuQ2FsbE1zZyIjChBFc3RpbWF0ZUdhc1JlcGx5Eg8KA2dhcxgBIAEoBEICMAAiKwobR2V0VHJhbnNhY3Rpb25CeUhhc2hSZXF1ZXN0EgwKBGhhc2gYASABKAwiYgoZR2V0VHJhbnNhY3Rpb25CeUhhc2hSZXBseRJFCgt0cmFuc2FjdGlvbhgBIAEoCzIwLmNhcGFiaWxpdGllcy5ibG9ja2NoYWluLmV2bS52MWFscGhhLlRyYW5zYWN0aW9uIqEBCgtUcmFuc2FjdGlvbhIRCgVub25jZRgBIAEoBEICMAASDwoDZ2FzGAIgASgEQgIwABIKCgJ0bxgDIAEoDBIMCgRkYXRhGAQgASgMEgwKBGhhc2gYBSABKAwSIAoFdmFsdWUYBiABKAsyES52YWx1ZXMudjEuQmlnSW50EiQKCWdhc19wcmljZRgHIAEoCzIRLnZhbHVlcy52MS5CaWdJbnQiLAocR2V0VHJhbnNhY3Rpb25SZWNlaXB0UmVxdWVzdBIMCgRoYXNoGAEgASgMIlsKGkdldFRyYW5zYWN0aW9uUmVjZWlwdFJlcGx5Ej0KB3JlY2VpcHQYASABKAsyLC5jYXBhYmlsaXRpZXMuYmxvY2tjaGFpbi5ldm0udjFhbHBoYS5SZWNlaXB0IpkCCgdSZWNlaXB0EhIKBnN0YXR1cxgBIAEoBEICMAASFAoIZ2FzX3VzZWQYAiABKARCAjAAEhQKCHR4X2luZGV4GAMgASgEQgIwABISCgpibG9ja19oYXNoGAQgASgMEjYKBGxvZ3MYBiADKAsyKC5jYXBhYmlsaXRpZXMuYmxvY2tjaGFpbi5ldm0udjFhbHBoYS5Mb2cSDwoHdHhfaGFzaBgHIAEoDBIuChNlZmZlY3RpdmVfZ2FzX3ByaWNlGAggASgLMhEudmFsdWVzLnYxLkJpZ0ludBInCgxibG9ja19udW1iZXIYCSABKAsyES52YWx1ZXMudjEuQmlnSW50EhgKEGNvbnRyYWN0X2FkZHJlc3MYCiABKAwiQAoVSGVhZGVyQnlOdW1iZXJSZXF1ZXN0EicKDGJsb2NrX251bWJlchgBIAEoCzIRLnZhbHVlcy52MS5CaWdJbnQiUgoTSGVhZGVyQnlOdW1iZXJSZXBseRI7CgZoZWFkZXIYASABKAsyKy5jYXBhYmlsaXRpZXMuYmxvY2tjaGFpbi5ldm0udjFhbHBoYS5IZWFkZXIiawoGSGVhZGVyEhUKCXRpbWVzdGFtcBgBIAEoBEICMAASJwoMYmxvY2tfbnVtYmVyGAIgASgLMhEudmFsdWVzLnYxLkJpZ0ludBIMCgRoYXNoGAMgASgMEhMKC3BhcmVudF9oYXNoGAQgASgMIqsBChJXcml0ZVJlcG9ydFJlcXVlc3QSEAoIcmVjZWl2ZXIYASABKAwSKwoGcmVwb3J0GAIgASgLMhsuc2RrLnYxYWxwaGEuUmVwb3J0UmVzcG9uc2USRwoKZ2FzX2NvbmZpZxgDIAEoCzIuLmNhcGFiaWxpdGllcy5ibG9ja2NoYWluLmV2bS52MWFscGhhLkdhc0NvbmZpZ0gAiAEBQg0KC19nYXNfY29uZmlnIiIKCUdhc0NvbmZpZxIVCglnYXNfbGltaXQYASABKARCAjAAIocDChBXcml0ZVJlcG9ydFJlcGx5EkAKCXR4X3N0YXR1cxgBIAEoDjItLmNhcGFiaWxpdGllcy5ibG9ja2NoYWluLmV2bS52MWFscGhhLlR4U3RhdHVzEnUKInJlY2VpdmVyX2NvbnRyYWN0X2V4ZWN1dGlvbl9zdGF0dXMYAiABKA4yRC5jYXBhYmlsaXRpZXMuYmxvY2tjaGFpbi5ldm0udjFhbHBoYS5SZWNlaXZlckNvbnRyYWN0RXhlY3V0aW9uU3RhdHVzSACIAQESFAoHdHhfaGFzaBgDIAEoDEgBiAEBEi8KD3RyYW5zYWN0aW9uX2ZlZRgEIAEoCzIRLnZhbHVlcy52MS5CaWdJbnRIAogBARIaCg1lcnJvcl9tZXNzYWdlGAUgASgJSAOIAQFCJQojX3JlY2VpdmVyX2NvbnRyYWN0X2V4ZWN1dGlvbl9zdGF0dXNCCgoIX3R4X2hhc2hCEgoQX3RyYW5zYWN0aW9uX2ZlZUIQCg5fZXJyb3JfbWVzc2FnZSppCg9Db25maWRlbmNlTGV2ZWwSGQoVQ09ORklERU5DRV9MRVZFTF9TQUZFEAASGwoXQ09ORklERU5DRV9MRVZFTF9MQVRFU1QQARIeChpDT05GSURFTkNFX0xFVkVMX0ZJTkFMSVpFRBACKoIBCh9SZWNlaXZlckNvbnRyYWN0RXhlY3V0aW9uU3RhdHVzEi4KKlJFQ0VJVkVSX0NPTlRSQUNUX0VYRUNVVElPTl9TVEFUVVNfU1VDQ0VTUxAAEi8KK1JFQ0VJVkVSX0NPTlRSQUNUX0VYRUNVVElPTl9TVEFUVVNfUkVWRVJURUQQASpOCghUeFN0YXR1cxITCg9UWF9TVEFUVVNfRkFUQUwQABIWChJUWF9TVEFUVVNfUkVWRVJURUQQARIVChFUWF9TVEFUVVNfU1VDQ0VTUxACMsMZCgZDbGllbnQSgAEKDENhbGxDb250cmFjdBI4LmNhcGFiaWxpdGllcy5ibG9ja2NoYWluLmV2bS52MWFscGhhLkNhbGxDb250cmFjdFJlcXVlc3QaNi5jYXBhYmlsaXRpZXMuYmxvY2tjaGFpbi5ldm0udjFhbHBoYS5DYWxsQ29udHJhY3RSZXBseRJ6CgpGaWx0ZXJMb2dzEjYuY2FwYWJpbGl0aWVzLmJsb2NrY2hhaW4uZXZtLnYxYWxwaGEuRmlsdGVyTG9nc1JlcXVlc3QaNC5jYXBhYmlsaXRpZXMuYmxvY2tjaGFpbi5ldm0udjFhbHBoYS5GaWx0ZXJMb2dzUmVwbHkSdwoJQmFsYW5jZUF0EjUuY2FwYWJpbGl0aWVzLmJsb2NrY2hhaW4uZXZtLnYxYWxwaGEuQmFsYW5jZUF0UmVxdWVzdBozLmNhcGFiaWxpdGllcy5ibG9ja2NoYWluLmV2bS52MWFscGhhLkJhbGFuY2VBdFJlcGx5En0KC0VzdGltYXRlR2FzEjcuY2FwYWJpbGl0aWVzLmJsb2NrY2hhaW4uZXZtLnYxYWxwaGEuRXN0aW1hdGVHYXNSZXF1ZXN0GjUuY2FwYWJpbGl0aWVzLmJsb2NrY2hhaW4uZXZtLnYxYWxwaGEuRXN0aW1hdGVHYXNSZXBseRKYAQoUR2V0VHJhbnNhY3Rpb25CeUhhc2gSQC5jYXBhYmlsaXRpZXMuYmxvY2tjaGFpbi5ldm0udjFhbHBoYS5HZXRUcmFuc2FjdGlvbkJ5SGFzaFJlcXVlc3QaPi5jYXBhYmlsaXRpZXMuYmxvY2tjaGFpbi5ldm0udjFhbHBoYS5HZXRUcmFuc2FjdGlvbkJ5SGFzaFJlcGx5EpsBChVHZXRUcmFuc2FjdGlvblJlY2VpcHQSQS5jYXBhYmlsaXRpZXMuYmxvY2tjaGFpbi5ldm0udjFhbHBoYS5HZXRUcmFuc2FjdGlvblJlY2VpcHRSZXF1ZXN0Gj8uY2FwYWJpbGl0aWVzLmJsb2NrY2hhaW4uZXZtLnYxYWxwaGEuR2V0VHJhbnNhY3Rpb25SZWNlaXB0UmVwbHkShgEKDkhlYWRlckJ5TnVtYmVyEjouY2FwYWJpbGl0aWVzLmJsb2NrY2hhaW4uZXZtLnYxYWxwaGEuSGVhZGVyQnlOdW1iZXJSZXF1ZXN0GjguY2FwYWJpbGl0aWVzLmJsb2NrY2hhaW4uZXZtLnYxYWxwaGEuSGVhZGVyQnlOdW1iZXJSZXBseRJ2CgpMb2dUcmlnZ2VyEjwuY2FwYWJpbGl0aWVzLmJsb2NrY2hhaW4uZXZtLnYxYWxwaGEuRmlsdGVyTG9nVHJpZ2dlclJlcXVlc3QaKC5jYXBhYmlsaXRpZXMuYmxvY2tjaGFpbi5ldm0udjFhbHBoYS5Mb2cwARJ9CgtXcml0ZVJlcG9ydBI3LmNhcGFiaWxpdGllcy5ibG9ja2NoYWluLmV2bS52MWFscGhhLldyaXRlUmVwb3J0UmVxdWVzdBo1LmNhcGFiaWxpdGllcy5ibG9ja2NoYWluLmV2bS52MWFscGhhLldyaXRlUmVwb3J0UmVwbHkaiBCCtRiDEAgBEglldm1AMS4wLjAa8w8KDUNoYWluU2VsZWN0b3IS4Q8S3g8KFwoLYWRpLW1haW5uZXQQ/PDmwrfn3ao4ChgKC2FkaS10ZXN0bmV0EP2myPr5hozaggEKJAoXYXBlY2hhaW4tdGVzdG5ldC1jdXJ0aXMQwcO0+I3EkrKJAQoXCgthcmMtdGVzdG5ldBDnxoye19fQjSoKHQoRYXZhbGFuY2hlLW1haW5uZXQQ1eeKwOHVmKRZCiMKFmF2YWxhbmNoZS10ZXN0bmV0LWZ1amkQm/n8kKLjqPjMAQooChtiaW5hbmNlX3NtYXJ0X2NoYWluLW1haW5uZXQQz/eU8djtlbidAQooChtiaW5hbmNlX3NtYXJ0X2NoYWluLXRlc3RuZXQQ+62+nICu5Iq4AQoYCgxjZWxvLW1haW5uZXQQhtTo2IaTiNcSChgKDGNlbG8tc2Vwb2xpYRDEw/yL/OedmjQKGgoOY3Jvbm9zLXRlc3RuZXQQ/dnureDe2sgpCiIKFWR0Y2MtdGVzdG5ldC1hbmRlc2l0ZRDSg+PQmZblpNcBChwKEGV0aGVyZXVtLW1haW5uZXQQlfbx5M+ypsJFCicKG2V0aGVyZXVtLW1haW5uZXQtYXJiaXRydW0tMRDE6I3Njpuh10QKJAoXZXRoZXJldW0tbWFpbm5ldC1iYXNlLTEQgv+rov65kNPdAQoiChZldGhlcmV1bS1tYWlubmV0LWluay0xEKCwpum35qqEMAokChhldGhlcmV1bS1tYWlubmV0LWxpbmVhLTEQtrrpmMu9sJtACiUKGWV0aGVyZXVtLW1haW5uZXQtbWFudGxlLTEQiue0leewg8wVCicKG2V0aGVyZXVtLW1haW5uZXQtb3B0aW1pc20tMRC4lY/D9/7Q6TMKJgoZZXRoZXJldW0tbWFpbm5ldC1zY3JvbGwtMRC4vOTrxL7In7cBCikKHWV0aGVyZXVtLW1haW5uZXQtd29ybGRjaGFpbi0xEIfvurfFtsK4HAolChlldGhlcmV1bS1tYWlubmV0LXhsYXllci0xEJal/JymqO/tKQolChlldGhlcmV1bS1tYWlubmV0LXprc3luYy0xEJTul9nttLHXFQolChhldGhlcmV1bS10ZXN0bmV0LXNlcG9saWEQ2bXkzvzJ7qDeAQovCiNldGhlcmV1bS10ZXN0bmV0LXNlcG9saWEtYXJiaXRydW0tMRDqzu7/6raEozAKLAofZXRoZXJldW0tdGVzdG5ldC1zZXBvbGlhLWJhc2UtMRC4yrnv9pCuyI8BCiwKIGV0aGVyZXVtLXRlc3RuZXQtc2Vwb2xpYS1saW5lYS0xEOuq1P6C+eavTwotCiFldGhlcmV1bS10ZXN0bmV0LXNlcG9saWEtbWFudGxlLTEQ1ca47s328qZyCi8KI2V0aGVyZXVtLXRlc3RuZXQtc2Vwb2xpYS1vcHRpbWlzbS0xEJ+GxaG+2MPASAotCiFldGhlcmV1bS10ZXN0bmV0LXNlcG9saWEtc2Nyb2xsLTEQi+m0vtu67dEfCjAKI2V0aGVyZXVtLXRlc3RuZXQtc2Vwb2xpYS11bmljaGFpbi0xELTe/uDsl6mWxAEKMQolZXRoZXJldW0tdGVzdG5ldC1zZXBvbGlhLXdvcmxkY2hhaW4tMRC63+DFx6nzxUkKLQohZXRoZXJldW0tdGVzdG5ldC1zZXBvbGlhLXprc3luYy0xELfB/P3yxIDeXwogChRnbm9zaXNfY2hhaW4tbWFpbm5ldBD0kq3a8qKuugYKJwobZ25vc2lzX2NoYWluLXRlc3RuZXQtY2hpYWRvELOxgtCbpY+PewofChNoeXBlcmxpcXVpZC1tYWlubmV0EKez+N3O0enyIQofChNoeXBlcmxpcXVpZC10ZXN0bmV0EIjO3ciX4Mm9OwogChNpbmstdGVzdG5ldC1zZXBvbGlhEOj0p6Xz5pbAhwEKGQoNam92YXktbWFpbm5ldBC1w8SaoYDfkhUKGQoNam92YXktdGVzdG5ldBDkz4qE3rLejg0KGwoPbWVnYWV0aC1tYWlubmV0EOqVtsi85KbIVAoeChFtZWdhZXRoLXRlc3RuZXQtMhDjjd6IsY/9k/0BCiQKF3BoYXJvcy1hdGxhbnRpYy10ZXN0bmV0EMyZ7eDOvK+03wEKGgoOcGhhcm9zLW1haW5uZXQQyMGHnvXvzaFsChsKDnBsYXNtYS1tYWlubmV0EPib8dHaydXGgQEKGgoOcGxhc21hLXRlc3RuZXQQ1Zu/pcO0mYc3ChsKD3BvbHlnb24tbWFpbm5ldBCxq+TwmpKGnTgKIQoUcG9seWdvbi10ZXN0bmV0LWFtb3kQzY/W3/HHkPrhAQokChhwcml2YXRlLXRlc3RuZXQtYW5kZXNpdGUQ1KaYpcGP3PxfCiIKFnByaXZhdGUtdGVzdG5ldC1wdW1pY2UQ+cLEtsSlxNsVCiUKGXByaXZhdGUtdGVzdG5ldC1xdWFydHppdGUQ+fCi3azdh/o5CiQKGHByaXZhdGUtdGVzdG5ldC1yaHlvbGl0ZRCB+onr4bTbsQgKGQoNc29uaWMtbWFpbm5ldBDRsuXt2aCynRcKGQoNc29uaWMtdGVzdG5ldBDIiPvUtMb6vBgKGAoLdGFjLXRlc3RuZXQQ1duN4/ufk9eDAQobCg54bGF5ZXItdGVzdG5ldBDJvqG0rcy83Y0BQuUBCidjb20uY2FwYWJpbGl0aWVzLmJsb2NrY2hhaW4uZXZtLnYxYWxwaGFCC0NsaWVudFByb3RvUAGiAgNDQkWqAiNDYXBhYmlsaXRpZXMuQmxvY2tjaGFpbi5Fdm0uVjFhbHBoYcoCI0NhcGFiaWxpdGllc1xCbG9ja2NoYWluXEV2bVxWMWFscGhh4gIvQ2FwYWJpbGl0aWVzXEJsb2NrY2hhaW5cRXZtXFYxYWxwaGFcR1BCTWV0YWRhdGHqAiZDYXBhYmlsaXRpZXM6OkJsb2NrY2hhaW46OkV2bTo6VjFhbHBoYWIGcHJvdG8z', [file_sdk_v1alpha_sdk, file_tools_generator_v1alpha_cre_metadata, file_values_v1_values]);
|
|
14
14
|
/**
|
|
15
15
|
* Describes the message capabilities.blockchain.evm.v1alpha.TopicValues.
|
|
16
16
|
* Use `create(TopicValuesSchema)` to create a new message.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// This file is auto-generated. Do not edit manually.
|
|
2
|
+
// Generated from: https://github.com/smartcontractkit/chain-selectors
|
|
3
|
+
const network = {
|
|
4
|
+
chainId: '2026041005',
|
|
5
|
+
chainSelector: {
|
|
6
|
+
name: 'dtcc-mainnet-appchain',
|
|
7
|
+
selector: 13879014182901017172n,
|
|
8
|
+
},
|
|
9
|
+
chainFamily: 'evm',
|
|
10
|
+
networkType: 'mainnet',
|
|
11
|
+
};
|
|
12
|
+
export default network;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// This file is auto-generated. Do not edit manually.
|
|
2
|
+
// Generated from: https://github.com/smartcontractkit/chain-selectors
|
|
3
|
+
const network = {
|
|
4
|
+
chainId: '2026041002',
|
|
5
|
+
chainSelector: {
|
|
6
|
+
name: 'private-testnet-quartzite',
|
|
7
|
+
selector: 4175996748267305081n,
|
|
8
|
+
},
|
|
9
|
+
chainFamily: 'evm',
|
|
10
|
+
networkType: 'testnet',
|
|
11
|
+
};
|
|
12
|
+
export default network;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { NetworkInfo } from '../sdk/utils/chain-selectors/types';
|
|
2
2
|
export declare const allNetworks: NetworkInfo[];
|
|
3
3
|
export declare const mainnet: {
|
|
4
|
-
readonly evm: readonly [NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo];
|
|
4
|
+
readonly evm: readonly [NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo];
|
|
5
5
|
readonly solana: readonly [NetworkInfo];
|
|
6
6
|
readonly aptos: readonly [NetworkInfo];
|
|
7
7
|
readonly sui: readonly [NetworkInfo];
|
|
@@ -9,7 +9,7 @@ export declare const mainnet: {
|
|
|
9
9
|
readonly tron: readonly [NetworkInfo];
|
|
10
10
|
};
|
|
11
11
|
export declare const testnet: {
|
|
12
|
-
readonly evm: readonly [NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo];
|
|
12
|
+
readonly evm: readonly [NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo, NetworkInfo];
|
|
13
13
|
readonly solana: readonly [NetworkInfo, NetworkInfo];
|
|
14
14
|
readonly aptos: readonly [NetworkInfo, NetworkInfo];
|
|
15
15
|
readonly sui: readonly [NetworkInfo, NetworkInfo];
|
|
@@ -30,6 +30,7 @@ import mainnet_evm_corn_mainnet from './chain-selectors/mainnet/evm/corn-mainnet
|
|
|
30
30
|
import mainnet_evm_creditcoin_mainnet from './chain-selectors/mainnet/evm/creditcoin-mainnet';
|
|
31
31
|
import mainnet_evm_cronos_mainnet from './chain-selectors/mainnet/evm/cronos-mainnet';
|
|
32
32
|
import mainnet_evm_cronos_zkevm_mainnet from './chain-selectors/mainnet/evm/cronos-zkevm-mainnet';
|
|
33
|
+
import mainnet_evm_dtcc_mainnet_appchain from './chain-selectors/mainnet/evm/dtcc-mainnet-appchain';
|
|
33
34
|
import mainnet_evm_edge_mainnet from './chain-selectors/mainnet/evm/edge-mainnet';
|
|
34
35
|
// Import all individual network files
|
|
35
36
|
import mainnet_evm_ethereum_mainnet from './chain-selectors/mainnet/evm/ethereum-mainnet';
|
|
@@ -254,6 +255,7 @@ import testnet_evm_private_testnet_mica from './chain-selectors/testnet/evm/priv
|
|
|
254
255
|
import testnet_evm_private_testnet_obsidian from './chain-selectors/testnet/evm/private-testnet-obsidian';
|
|
255
256
|
import testnet_evm_private_testnet_opala from './chain-selectors/testnet/evm/private-testnet-opala';
|
|
256
257
|
import testnet_evm_private_testnet_pumice from './chain-selectors/testnet/evm/private-testnet-pumice';
|
|
258
|
+
import testnet_evm_private_testnet_quartzite from './chain-selectors/testnet/evm/private-testnet-quartzite';
|
|
257
259
|
import testnet_evm_private_testnet_rhyolite from './chain-selectors/testnet/evm/private-testnet-rhyolite';
|
|
258
260
|
import testnet_evm_robinhood_testnet from './chain-selectors/testnet/evm/robinhood-testnet';
|
|
259
261
|
import testnet_evm_ronin_testnet_saigon from './chain-selectors/testnet/evm/ronin-testnet-saigon';
|
|
@@ -556,8 +558,10 @@ export const allNetworks = [
|
|
|
556
558
|
testnet_evm_ethereum_testnet_sepolia_blast_1,
|
|
557
559
|
mainnet_evm_tron_mainnet_evm,
|
|
558
560
|
testnet_evm_zora_testnet,
|
|
561
|
+
testnet_evm_private_testnet_quartzite,
|
|
559
562
|
testnet_evm_private_testnet_rhyolite,
|
|
560
563
|
testnet_evm_private_testnet_pumice,
|
|
564
|
+
mainnet_evm_dtcc_mainnet_appchain,
|
|
561
565
|
testnet_evm_tron_testnet_shasta_evm,
|
|
562
566
|
testnet_evm_tron_devnet_evm,
|
|
563
567
|
testnet_evm_tron_testnet_nile_evm,
|
|
@@ -697,6 +701,7 @@ export const mainnet = {
|
|
|
697
701
|
mainnet_evm_zora_mainnet,
|
|
698
702
|
mainnet_evm_corn_mainnet,
|
|
699
703
|
mainnet_evm_tron_mainnet_evm,
|
|
704
|
+
mainnet_evm_dtcc_mainnet_appchain,
|
|
700
705
|
],
|
|
701
706
|
solana: [mainnet_solana_solana_mainnet],
|
|
702
707
|
aptos: [mainnet_aptos_aptos_mainnet],
|
|
@@ -856,6 +861,7 @@ export const testnet = {
|
|
|
856
861
|
testnet_evm_plume_testnet,
|
|
857
862
|
testnet_evm_ethereum_testnet_sepolia_blast_1,
|
|
858
863
|
testnet_evm_zora_testnet,
|
|
864
|
+
testnet_evm_private_testnet_quartzite,
|
|
859
865
|
testnet_evm_private_testnet_rhyolite,
|
|
860
866
|
testnet_evm_private_testnet_pumice,
|
|
861
867
|
testnet_evm_tron_testnet_shasta_evm,
|
|
@@ -991,6 +997,7 @@ export const mainnetBySelector = new Map([
|
|
|
991
997
|
[3555797439612589184n, mainnet_evm_zora_mainnet],
|
|
992
998
|
[9043146809313071210n, mainnet_evm_corn_mainnet],
|
|
993
999
|
[1546563616611573946n, mainnet_evm_tron_mainnet_evm],
|
|
1000
|
+
[13879014182901017172n, mainnet_evm_dtcc_mainnet_appchain],
|
|
994
1001
|
[124615329519749607n, mainnet_solana_solana_mainnet],
|
|
995
1002
|
[4741433654826277614n, mainnet_aptos_aptos_mainnet],
|
|
996
1003
|
[17529533435026248318n, mainnet_sui_sui_mainnet],
|
|
@@ -1148,6 +1155,7 @@ export const testnetBySelector = new Map([
|
|
|
1148
1155
|
[14684575664602284776n, testnet_evm_plume_testnet],
|
|
1149
1156
|
[2027362563942762617n, testnet_evm_ethereum_testnet_sepolia_blast_1],
|
|
1150
1157
|
[16244020411108056671n, testnet_evm_zora_testnet],
|
|
1158
|
+
[4175996748267305081n, testnet_evm_private_testnet_quartzite],
|
|
1151
1159
|
[604447335222770945n, testnet_evm_private_testnet_rhyolite],
|
|
1152
1160
|
[1564738277398880633n, testnet_evm_private_testnet_pumice],
|
|
1153
1161
|
[13231703482326770598n, testnet_evm_tron_testnet_shasta_evm],
|
|
@@ -1284,6 +1292,7 @@ export const mainnetByName = new Map([
|
|
|
1284
1292
|
['zora-mainnet', mainnet_evm_zora_mainnet],
|
|
1285
1293
|
['corn-mainnet', mainnet_evm_corn_mainnet],
|
|
1286
1294
|
['tron-mainnet-evm', mainnet_evm_tron_mainnet_evm],
|
|
1295
|
+
['dtcc-mainnet-appchain', mainnet_evm_dtcc_mainnet_appchain],
|
|
1287
1296
|
['solana-mainnet', mainnet_solana_solana_mainnet],
|
|
1288
1297
|
['aptos-mainnet', mainnet_aptos_aptos_mainnet],
|
|
1289
1298
|
['sui-mainnet', mainnet_sui_sui_mainnet],
|
|
@@ -1456,6 +1465,7 @@ export const testnetByName = new Map([
|
|
|
1456
1465
|
['plume-testnet', testnet_evm_plume_testnet],
|
|
1457
1466
|
['ethereum-testnet-sepolia-blast-1', testnet_evm_ethereum_testnet_sepolia_blast_1],
|
|
1458
1467
|
['zora-testnet', testnet_evm_zora_testnet],
|
|
1468
|
+
['private-testnet-quartzite', testnet_evm_private_testnet_quartzite],
|
|
1459
1469
|
['private-testnet-rhyolite', testnet_evm_private_testnet_rhyolite],
|
|
1460
1470
|
['private-testnet-pumice', testnet_evm_private_testnet_pumice],
|
|
1461
1471
|
['tron-testnet-shasta-evm', testnet_evm_tron_testnet_shasta_evm],
|
|
@@ -1593,6 +1603,7 @@ export const mainnetBySelectorByFamily = {
|
|
|
1593
1603
|
[3555797439612589184n, mainnet_evm_zora_mainnet],
|
|
1594
1604
|
[9043146809313071210n, mainnet_evm_corn_mainnet],
|
|
1595
1605
|
[1546563616611573946n, mainnet_evm_tron_mainnet_evm],
|
|
1606
|
+
[13879014182901017172n, mainnet_evm_dtcc_mainnet_appchain],
|
|
1596
1607
|
]),
|
|
1597
1608
|
solana: new Map([[124615329519749607n, mainnet_solana_solana_mainnet]]),
|
|
1598
1609
|
aptos: new Map([[4741433654826277614n, mainnet_aptos_aptos_mainnet]]),
|
|
@@ -1752,6 +1763,7 @@ export const testnetBySelectorByFamily = {
|
|
|
1752
1763
|
[14684575664602284776n, testnet_evm_plume_testnet],
|
|
1753
1764
|
[2027362563942762617n, testnet_evm_ethereum_testnet_sepolia_blast_1],
|
|
1754
1765
|
[16244020411108056671n, testnet_evm_zora_testnet],
|
|
1766
|
+
[4175996748267305081n, testnet_evm_private_testnet_quartzite],
|
|
1755
1767
|
[604447335222770945n, testnet_evm_private_testnet_rhyolite],
|
|
1756
1768
|
[1564738277398880633n, testnet_evm_private_testnet_pumice],
|
|
1757
1769
|
[13231703482326770598n, testnet_evm_tron_testnet_shasta_evm],
|
|
@@ -1900,6 +1912,7 @@ export const mainnetByNameByFamily = {
|
|
|
1900
1912
|
['zora-mainnet', mainnet_evm_zora_mainnet],
|
|
1901
1913
|
['corn-mainnet', mainnet_evm_corn_mainnet],
|
|
1902
1914
|
['tron-mainnet-evm', mainnet_evm_tron_mainnet_evm],
|
|
1915
|
+
['dtcc-mainnet-appchain', mainnet_evm_dtcc_mainnet_appchain],
|
|
1903
1916
|
]),
|
|
1904
1917
|
solana: new Map([['solana-mainnet', mainnet_solana_solana_mainnet]]),
|
|
1905
1918
|
aptos: new Map([['aptos-mainnet', mainnet_aptos_aptos_mainnet]]),
|
|
@@ -2077,6 +2090,7 @@ export const testnetByNameByFamily = {
|
|
|
2077
2090
|
['plume-testnet', testnet_evm_plume_testnet],
|
|
2078
2091
|
['ethereum-testnet-sepolia-blast-1', testnet_evm_ethereum_testnet_sepolia_blast_1],
|
|
2079
2092
|
['zora-testnet', testnet_evm_zora_testnet],
|
|
2093
|
+
['private-testnet-quartzite', testnet_evm_private_testnet_quartzite],
|
|
2080
2094
|
['private-testnet-rhyolite', testnet_evm_private_testnet_rhyolite],
|
|
2081
2095
|
['private-testnet-pumice', testnet_evm_private_testnet_pumice],
|
|
2082
2096
|
['tron-testnet-shasta-evm', testnet_evm_tron_testnet_shasta_evm],
|
|
@@ -83,6 +83,7 @@ export declare class ClientCapability {
|
|
|
83
83
|
readonly 'polygon-testnet-amoy': 16281711391670634445n;
|
|
84
84
|
readonly 'private-testnet-andesite': 6915682381028791124n;
|
|
85
85
|
readonly 'private-testnet-pumice': 1564738277398880633n;
|
|
86
|
+
readonly 'private-testnet-quartzite': 4175996748267305081n;
|
|
86
87
|
readonly 'private-testnet-rhyolite': 604447335222770945n;
|
|
87
88
|
readonly 'sonic-mainnet': 1673871237479749969n;
|
|
88
89
|
readonly 'sonic-testnet': 1763698235108410440n;
|
|
@@ -92,6 +92,7 @@ export class ClientCapability {
|
|
|
92
92
|
'polygon-testnet-amoy': 16281711391670634445n,
|
|
93
93
|
'private-testnet-andesite': 6915682381028791124n,
|
|
94
94
|
'private-testnet-pumice': 1564738277398880633n,
|
|
95
|
+
'private-testnet-quartzite': 4175996748267305081n,
|
|
95
96
|
'private-testnet-rhyolite': 604447335222770945n,
|
|
96
97
|
'sonic-mainnet': 1673871237479749969n,
|
|
97
98
|
'sonic-testnet': 1763698235108410440n,
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { decodeFunctionData, encodeFunctionResult, } from 'viem';
|
|
2
|
-
import { chainContractHandler } from './contract-mock-core';
|
|
3
2
|
function bytesToHexAddress(bytes) {
|
|
4
3
|
return `0x${Array.from(bytes)
|
|
5
4
|
.map((b) => b.toString(16).padStart(2, '0'))
|
|
@@ -50,67 +49,66 @@ export function addContractMock(evmMock, options) {
|
|
|
50
49
|
const mock = {};
|
|
51
50
|
const normalizedAddress = options.address.toLowerCase();
|
|
52
51
|
const previousCallContract = evmMock.callContract;
|
|
53
|
-
evmMock.callContract =
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
decoded = decodeFunctionData({
|
|
69
|
-
abi: options.abi,
|
|
70
|
-
data: callDataHex,
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
catch (e) {
|
|
74
|
-
if (previousCallContract)
|
|
75
|
-
return previousCallContract(req);
|
|
76
|
-
throw new Error(`addContractMock: failed to decode function data for ${options.address}: ${e instanceof Error ? e.message : e}`);
|
|
77
|
-
}
|
|
78
|
-
const handler = mock[decoded.functionName];
|
|
79
|
-
if (typeof handler !== 'function') {
|
|
80
|
-
throw new Error(`addContractMock: no handler set for ${decoded.functionName} on ${options.address}`);
|
|
81
|
-
}
|
|
82
|
-
const result = handler(...(decoded.args ?? []));
|
|
83
|
-
const encoded = encodeFunctionResult({
|
|
52
|
+
evmMock.callContract = (req) => {
|
|
53
|
+
const toBytes = req.call?.to;
|
|
54
|
+
if (!toBytes || bytesToHexAddress(toBytes) !== normalizedAddress) {
|
|
55
|
+
if (previousCallContract)
|
|
56
|
+
return previousCallContract(req);
|
|
57
|
+
throw new Error(`addContractMock: no mock registered for address ${toBytes ? bytesToHexAddress(toBytes) : '(empty)'}`);
|
|
58
|
+
}
|
|
59
|
+
const dataBytes = req.call?.data;
|
|
60
|
+
if (!dataBytes || dataBytes.length < 4) {
|
|
61
|
+
throw new Error('addContractMock: call data too short (need at least 4 bytes for selector)');
|
|
62
|
+
}
|
|
63
|
+
const callDataHex = bytesToHex(dataBytes);
|
|
64
|
+
let decoded;
|
|
65
|
+
try {
|
|
66
|
+
decoded = decodeFunctionData({
|
|
84
67
|
abi: options.abi,
|
|
85
|
-
|
|
86
|
-
result: result,
|
|
68
|
+
data: callDataHex,
|
|
87
69
|
});
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
70
|
+
}
|
|
71
|
+
catch (e) {
|
|
72
|
+
if (previousCallContract)
|
|
73
|
+
return previousCallContract(req);
|
|
74
|
+
throw new Error(`addContractMock: failed to decode function data for ${options.address}: ${e instanceof Error ? e.message : e}`);
|
|
75
|
+
}
|
|
76
|
+
const handler = mock[decoded.functionName];
|
|
77
|
+
if (typeof handler !== 'function') {
|
|
78
|
+
throw new Error(`addContractMock: no handler set for ${decoded.functionName} on ${options.address}`);
|
|
79
|
+
}
|
|
80
|
+
const result = handler(...(decoded.args ?? []));
|
|
81
|
+
const encoded = encodeFunctionResult({
|
|
82
|
+
abi: options.abi,
|
|
83
|
+
functionName: decoded.functionName,
|
|
84
|
+
result: result,
|
|
85
|
+
});
|
|
86
|
+
return {
|
|
87
|
+
data: hexToUint8Array(encoded),
|
|
88
|
+
};
|
|
89
|
+
};
|
|
93
90
|
const previousWriteReport = evmMock.writeReport;
|
|
94
|
-
evmMock.writeReport =
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
91
|
+
evmMock.writeReport = (req) => {
|
|
92
|
+
const receiverBytes = req.receiver;
|
|
93
|
+
if (!receiverBytes || bytesToHexAddress(receiverBytes) !== normalizedAddress) {
|
|
94
|
+
if (previousWriteReport)
|
|
95
|
+
return previousWriteReport(req);
|
|
96
|
+
throw new Error(`addContractMock: no writeReport mock registered for receiver ${receiverBytes ? bytesToHexAddress(receiverBytes) : '(empty)'}`);
|
|
97
|
+
}
|
|
98
|
+
if (typeof mock.writeReport !== 'function') {
|
|
99
|
+
throw new Error(`addContractMock: no writeReport handler set for ${options.address}`);
|
|
100
|
+
}
|
|
101
|
+
if (!req.report) {
|
|
102
|
+
throw new Error(`addContractMock: writeReport called without report for ${options.address}`);
|
|
103
|
+
}
|
|
104
|
+
if (!req.gasConfig) {
|
|
105
|
+
throw new Error(`addContractMock: writeReport called without gasConfig for ${options.address}`);
|
|
106
|
+
}
|
|
107
|
+
return mock.writeReport({
|
|
108
|
+
receiver: req.receiver,
|
|
109
|
+
report: req.report,
|
|
110
|
+
gasConfig: req.gasConfig,
|
|
111
|
+
});
|
|
112
|
+
};
|
|
115
113
|
return mock;
|
|
116
114
|
}
|
package/dist/sdk/test/index.d.ts
CHANGED
|
@@ -6,4 +6,3 @@ export { type CapabilityHandler, DEFAULT_MAX_RESPONSE_SIZE_BYTES, getTestCapabil
|
|
|
6
6
|
export { TestWriter } from '../testutils/test-writer';
|
|
7
7
|
export { type AddContractMockOptions, addContractMock, type ContractMock, type WriteReportMockInput, } from './evm-contract-mock';
|
|
8
8
|
export * from './generated';
|
|
9
|
-
export { type AddSolanaContractMockOptions, addSolanaContractMock, type SolanaContractMock, type SolanaWriteReportMockInput, } from './solana-contract-mock';
|
package/dist/sdk/test/index.js
CHANGED
|
@@ -6,4 +6,3 @@ export { DEFAULT_MAX_RESPONSE_SIZE_BYTES, getTestCapabilityHandler, newTestRunti
|
|
|
6
6
|
export { TestWriter } from '../testutils/test-writer';
|
|
7
7
|
export { addContractMock, } from './evm-contract-mock';
|
|
8
8
|
export * from './generated';
|
|
9
|
-
export { addSolanaContractMock, } from './solana-contract-mock';
|
package/dist/sdk/utils/capabilities/blockchain/{evm/evm-helpers.d.ts → blockchain-helpers.d.ts}
RENAMED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import type { CallMsgJson, FilterLogTriggerRequestJson } from '
|
|
2
|
-
import type { ReportRequestJson } from '
|
|
3
|
-
import { type BigInt as GeneratedBigInt } from '
|
|
1
|
+
import type { CallMsgJson, FilterLogTriggerRequestJson } from '../../../../generated/capabilities/blockchain/evm/v1alpha/client_pb';
|
|
2
|
+
import type { ReportRequestJson } from '../../../../generated/sdk/v1alpha/sdk_pb';
|
|
3
|
+
import { type BigInt as GeneratedBigInt } from '../../../../generated/values/v1/values_pb';
|
|
4
4
|
import type { Address, Hex } from 'viem';
|
|
5
|
-
import { type ReportEncoder } from '../report-helpers';
|
|
6
5
|
/**
|
|
7
6
|
* Protobuf BigInt structure returned by SDK methods (e.g., headerByNumber).
|
|
8
7
|
* Uses Pick to extract just the data fields from the generated type.
|
|
@@ -21,7 +20,7 @@ export type ProtoBigInt = Pick<GeneratedBigInt, 'absVal' | 'sign'>;
|
|
|
21
20
|
* @param n - The native bigint, number, or string value.
|
|
22
21
|
* @returns The protobuf BigInt JSON representation.
|
|
23
22
|
*/
|
|
24
|
-
export declare const bigintToProtoBigInt: (n: number | bigint | string) => import("
|
|
23
|
+
export declare const bigintToProtoBigInt: (n: number | bigint | string) => import("../../../../generated/values/v1/values_pb").BigIntJson;
|
|
25
24
|
/**
|
|
26
25
|
* Converts a protobuf BigInt to a native JS bigint.
|
|
27
26
|
* Use this when extracting bigint values from SDK responses.
|
|
@@ -42,7 +41,7 @@ export declare const protoBigIntToBigint: (pb: ProtoBigInt) => bigint;
|
|
|
42
41
|
* @param n - The block number.
|
|
43
42
|
* @returns The protobuf BigInt JSON representation.
|
|
44
43
|
*/
|
|
45
|
-
export declare const blockNumber: (n: number | bigint | string) => import("
|
|
44
|
+
export declare const blockNumber: (n: number | bigint | string) => import("../../../../generated/values/v1/values_pb").BigIntJson;
|
|
46
45
|
/**
|
|
47
46
|
* EVM Capability Helper.
|
|
48
47
|
*
|
|
@@ -107,7 +106,7 @@ export declare const EVM_DEFAULT_REPORT_ENCODER: {
|
|
|
107
106
|
* @param reportEncoder - The report encoder to be used. Defaults to EVM_DEFAULT_REPORT_ENCODER.
|
|
108
107
|
* @returns The prepared report request.
|
|
109
108
|
*/
|
|
110
|
-
export declare const prepareReportRequest: (hexEncodedPayload: Hex, reportEncoder?:
|
|
109
|
+
export declare const prepareReportRequest: (hexEncodedPayload: Hex, reportEncoder?: Omit<ReportRequestJson, "encodedPayload">) => ReportRequestJson;
|
|
111
110
|
export interface LogTriggerConfigOptions {
|
|
112
111
|
/** EVM addresses to monitor — hex strings with 0x prefix (20 bytes each) */
|
|
113
112
|
addresses: Hex[];
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { create, toJson } from '@bufbuild/protobuf';
|
|
2
|
-
import { BigIntSchema } from '
|
|
3
|
-
import { EVMClient } from '
|
|
4
|
-
import { bigintToBytes, bytesToBigint, hexToBase64, hexToBytes } from '
|
|
5
|
-
import { assertSafeIntegerNumber } from '
|
|
6
|
-
import { prepareReportRequestFromBytes } from '../report-helpers';
|
|
2
|
+
import { BigIntSchema } from '../../../../generated/values/v1/values_pb';
|
|
3
|
+
import { EVMClient } from '../../../cre';
|
|
4
|
+
import { bigintToBytes, bytesToBigint, hexToBase64, hexToBytes } from '../../hex-utils';
|
|
5
|
+
import { assertSafeIntegerNumber } from '../../safe-integer';
|
|
7
6
|
/**
|
|
8
7
|
* Converts a native JS bigint to a protobuf BigInt JSON representation.
|
|
9
8
|
* Use this when passing bigint values to SDK methods.
|
|
@@ -127,7 +126,10 @@ export const EVM_DEFAULT_REPORT_ENCODER = {
|
|
|
127
126
|
* @param reportEncoder - The report encoder to be used. Defaults to EVM_DEFAULT_REPORT_ENCODER.
|
|
128
127
|
* @returns The prepared report request.
|
|
129
128
|
*/
|
|
130
|
-
export const prepareReportRequest = (hexEncodedPayload, reportEncoder = EVM_DEFAULT_REPORT_ENCODER) =>
|
|
129
|
+
export const prepareReportRequest = (hexEncodedPayload, reportEncoder = EVM_DEFAULT_REPORT_ENCODER) => ({
|
|
130
|
+
encodedPayload: hexToBase64(hexEncodedPayload),
|
|
131
|
+
...reportEncoder,
|
|
132
|
+
});
|
|
131
133
|
/**
|
|
132
134
|
* Validates a hex string and checks that the decoded bytes have the expected length.
|
|
133
135
|
*/
|
|
@@ -13,12 +13,6 @@ export declare const hexToBytes: (hexStr: string) => Uint8Array;
|
|
|
13
13
|
* Convert Uint8Array to hex string with 0x prefix
|
|
14
14
|
*/
|
|
15
15
|
export declare const bytesToHex: (bytes: Uint8Array) => Hex;
|
|
16
|
-
/**
|
|
17
|
-
* Encode raw bytes as base64 string
|
|
18
|
-
* @param bytes
|
|
19
|
-
* @returns
|
|
20
|
-
*/
|
|
21
|
-
export declare const bytesToBase64: (bytes: Uint8Array) => string;
|
|
22
16
|
/**
|
|
23
17
|
* Encode hex as base64 string
|
|
24
18
|
* @param hex
|
|
@@ -28,14 +28,6 @@ export const bytesToHex = (bytes) => {
|
|
|
28
28
|
.map((b) => b.toString(16).padStart(2, '0'))
|
|
29
29
|
.join('')}`;
|
|
30
30
|
};
|
|
31
|
-
/**
|
|
32
|
-
* Encode raw bytes as base64 string
|
|
33
|
-
* @param bytes
|
|
34
|
-
* @returns
|
|
35
|
-
*/
|
|
36
|
-
export const bytesToBase64 = (bytes) => {
|
|
37
|
-
return Buffer.from(bytes).toString('base64');
|
|
38
|
-
};
|
|
39
31
|
/**
|
|
40
32
|
* Encode hex as base64 string
|
|
41
33
|
* @param hex
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
export * from './capabilities/blockchain/
|
|
2
|
-
export type { ReportEncoder } from './capabilities/blockchain/report-helpers';
|
|
3
|
-
export * from './capabilities/blockchain/solana/solana-helpers';
|
|
1
|
+
export * from './capabilities/blockchain/blockchain-helpers';
|
|
4
2
|
export * from './capabilities/http/http-helpers';
|
|
5
3
|
export * from './chain-selectors';
|
|
6
4
|
export * from './decode-json';
|
package/dist/sdk/utils/index.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
export * from './capabilities/blockchain/
|
|
2
|
-
export * from './capabilities/blockchain/solana/solana-helpers';
|
|
1
|
+
export * from './capabilities/blockchain/blockchain-helpers';
|
|
3
2
|
export * from './capabilities/http/http-helpers';
|
|
4
3
|
export * from './chain-selectors';
|
|
5
4
|
export * from './decode-json';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chainlink/cre-sdk",
|
|
3
|
-
"version": "1.14.0
|
|
3
|
+
"version": "1.14.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -61,10 +61,7 @@
|
|
|
61
61
|
"dependencies": {
|
|
62
62
|
"@bufbuild/protobuf": "2.6.3",
|
|
63
63
|
"@bufbuild/protoc-gen-es": "2.6.3",
|
|
64
|
-
"@chainlink/cre-sdk-javy-plugin": "1.
|
|
65
|
-
"@noble/hashes": "1.8.0",
|
|
66
|
-
"@solana/addresses": "6.9.0",
|
|
67
|
-
"@solana/codecs": "6.9.0",
|
|
64
|
+
"@chainlink/cre-sdk-javy-plugin": "1.7.0",
|
|
68
65
|
"@standard-schema/spec": "1.0.0",
|
|
69
66
|
"viem": "2.34.0",
|
|
70
67
|
"zod": "3.25.76"
|
|
@@ -73,7 +70,7 @@
|
|
|
73
70
|
"@biomejs/biome": "2.3.14",
|
|
74
71
|
"@bufbuild/buf": "1.56.0",
|
|
75
72
|
"@types/bun": "1.3.8",
|
|
76
|
-
"chain-selectors": "https://github.com/smartcontractkit/chain-selectors.git#
|
|
73
|
+
"chain-selectors": "https://github.com/smartcontractkit/chain-selectors.git#3e718d1c9910b2952c50befe378b0fe8707e6647",
|
|
77
74
|
"fast-glob": "3.3.3",
|
|
78
75
|
"ts-proto": "2.7.5",
|
|
79
76
|
"typescript": "5.9.3",
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Chain-agnostic core of the per-contract mock routing used by
|
|
3
|
-
* `addContractMock` (EVM) and `addSolanaContractMock` (Solana).
|
|
4
|
-
*
|
|
5
|
-
* Builds a handler that routes a request to `handle` when `matches` returns
|
|
6
|
-
* true, falls through to the previously installed handler otherwise, and
|
|
7
|
-
* throws `noMatchError` when there is nothing to fall through to. Installing
|
|
8
|
-
* the returned handler over the previous one is what lets multiple contract
|
|
9
|
-
* mocks chain on the same capability mock.
|
|
10
|
-
*/
|
|
11
|
-
export declare function chainContractHandler<TReq, TReply>(options: {
|
|
12
|
-
previous: ((req: TReq) => TReply) | undefined;
|
|
13
|
-
matches: (req: TReq) => boolean;
|
|
14
|
-
handle: (req: TReq) => TReply;
|
|
15
|
-
noMatchError: (req: TReq) => string;
|
|
16
|
-
}): (req: TReq) => TReply;
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Chain-agnostic core of the per-contract mock routing used by
|
|
3
|
-
* `addContractMock` (EVM) and `addSolanaContractMock` (Solana).
|
|
4
|
-
*
|
|
5
|
-
* Builds a handler that routes a request to `handle` when `matches` returns
|
|
6
|
-
* true, falls through to the previously installed handler otherwise, and
|
|
7
|
-
* throws `noMatchError` when there is nothing to fall through to. Installing
|
|
8
|
-
* the returned handler over the previous one is what lets multiple contract
|
|
9
|
-
* mocks chain on the same capability mock.
|
|
10
|
-
*/
|
|
11
|
-
export function chainContractHandler(options) {
|
|
12
|
-
const { previous, matches, handle, noMatchError } = options;
|
|
13
|
-
return (req) => {
|
|
14
|
-
if (!matches(req)) {
|
|
15
|
-
if (previous)
|
|
16
|
-
return previous(req);
|
|
17
|
-
throw new Error(noMatchError(req));
|
|
18
|
-
}
|
|
19
|
-
return handle(req);
|
|
20
|
-
};
|
|
21
|
-
}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import type { AccountMeta, ComputeConfig, WriteReportReply, WriteReportReplyJson } from '../../generated/capabilities/blockchain/solana/v1alpha/client_pb';
|
|
2
|
-
import type { ReportResponse } from '../../generated/sdk/v1alpha/sdk_pb';
|
|
3
|
-
import type { SolanaMock } from './generated';
|
|
4
|
-
/**
|
|
5
|
-
* Strict version of {@link WriteReportRequest} where `report` is guaranteed
|
|
6
|
-
* to be present. Used by mock handlers so tests don't need to check for
|
|
7
|
-
* undefined.
|
|
8
|
-
*/
|
|
9
|
-
export interface SolanaWriteReportMockInput {
|
|
10
|
-
receiver: Uint8Array;
|
|
11
|
-
report: ReportResponse;
|
|
12
|
-
remainingAccounts: AccountMeta[];
|
|
13
|
-
computeConfig?: ComputeConfig;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* A program mock returned by {@link addSolanaContractMock}.
|
|
17
|
-
*
|
|
18
|
-
* The Solana CRE capability is write-only, so the only routable handler is
|
|
19
|
-
* `writeReport`. When set, write-report calls targeting this program's ID are
|
|
20
|
-
* routed here; calls for other receivers chain to previously registered mocks.
|
|
21
|
-
*/
|
|
22
|
-
export interface SolanaContractMock {
|
|
23
|
-
writeReport?: (input: SolanaWriteReportMockInput) => WriteReportReply | WriteReportReplyJson;
|
|
24
|
-
}
|
|
25
|
-
export interface AddSolanaContractMockOptions {
|
|
26
|
-
/** The receiver program ID — base58 string or 32 raw bytes. */
|
|
27
|
-
programId: string | Uint8Array;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Registers a typed program mock on a {@link SolanaMock} instance.
|
|
31
|
-
*
|
|
32
|
-
* This is the Solana counterpart of {@link addContractMock}: it intercepts
|
|
33
|
-
* `writeReport` on the provided mock, routing calls by receiver program ID.
|
|
34
|
-
* Multiple programs can be mocked on the same `SolanaMock` — each call to
|
|
35
|
-
* `addSolanaContractMock` chains with the previous handler.
|
|
36
|
-
*
|
|
37
|
-
* @example
|
|
38
|
-
* ```ts
|
|
39
|
-
* const solanaMock = SolanaMock.testInstance(chainSelector);
|
|
40
|
-
*
|
|
41
|
-
* const dataStorage = addSolanaContractMock(solanaMock, {
|
|
42
|
-
* programId: 'ECL8142j2YQAvs9R9geSsRnkVH2wLEi7soJCRyJ74cfL',
|
|
43
|
-
* });
|
|
44
|
-
*
|
|
45
|
-
* dataStorage.writeReport = ({ report, remainingAccounts }) => {
|
|
46
|
-
* return { txSignature: new Uint8Array(64) };
|
|
47
|
-
* };
|
|
48
|
-
* ```
|
|
49
|
-
*
|
|
50
|
-
* @param solanaMock - The `SolanaMock` instance to attach to.
|
|
51
|
-
* @param options - The receiver program ID to route on.
|
|
52
|
-
* @returns A mock object with a settable `writeReport` handler.
|
|
53
|
-
*/
|
|
54
|
-
export declare function addSolanaContractMock(solanaMock: SolanaMock, options: AddSolanaContractMockOptions): SolanaContractMock;
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { solanaAddressToBytes } from '../utils/capabilities/blockchain/solana/solana-helpers';
|
|
2
|
-
import { chainContractHandler } from './contract-mock-core';
|
|
3
|
-
function bytesEqual(a, b) {
|
|
4
|
-
if (a.length !== b.length)
|
|
5
|
-
return false;
|
|
6
|
-
return a.every((byte, i) => byte === b[i]);
|
|
7
|
-
}
|
|
8
|
-
function describeReceiver(receiver) {
|
|
9
|
-
return receiver ? `0x${Buffer.from(receiver).toString('hex')}` : '(empty)';
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Registers a typed program mock on a {@link SolanaMock} instance.
|
|
13
|
-
*
|
|
14
|
-
* This is the Solana counterpart of {@link addContractMock}: it intercepts
|
|
15
|
-
* `writeReport` on the provided mock, routing calls by receiver program ID.
|
|
16
|
-
* Multiple programs can be mocked on the same `SolanaMock` — each call to
|
|
17
|
-
* `addSolanaContractMock` chains with the previous handler.
|
|
18
|
-
*
|
|
19
|
-
* @example
|
|
20
|
-
* ```ts
|
|
21
|
-
* const solanaMock = SolanaMock.testInstance(chainSelector);
|
|
22
|
-
*
|
|
23
|
-
* const dataStorage = addSolanaContractMock(solanaMock, {
|
|
24
|
-
* programId: 'ECL8142j2YQAvs9R9geSsRnkVH2wLEi7soJCRyJ74cfL',
|
|
25
|
-
* });
|
|
26
|
-
*
|
|
27
|
-
* dataStorage.writeReport = ({ report, remainingAccounts }) => {
|
|
28
|
-
* return { txSignature: new Uint8Array(64) };
|
|
29
|
-
* };
|
|
30
|
-
* ```
|
|
31
|
-
*
|
|
32
|
-
* @param solanaMock - The `SolanaMock` instance to attach to.
|
|
33
|
-
* @param options - The receiver program ID to route on.
|
|
34
|
-
* @returns A mock object with a settable `writeReport` handler.
|
|
35
|
-
*/
|
|
36
|
-
export function addSolanaContractMock(solanaMock, options) {
|
|
37
|
-
const mock = {};
|
|
38
|
-
const programIdBytes = typeof options.programId === 'string'
|
|
39
|
-
? solanaAddressToBytes(options.programId)
|
|
40
|
-
: options.programId;
|
|
41
|
-
const programIdLabel = typeof options.programId === 'string' ? options.programId : describeReceiver(options.programId);
|
|
42
|
-
const previousWriteReport = solanaMock.writeReport;
|
|
43
|
-
solanaMock.writeReport = chainContractHandler({
|
|
44
|
-
previous: previousWriteReport,
|
|
45
|
-
matches: (req) => !!req.receiver && bytesEqual(req.receiver, programIdBytes),
|
|
46
|
-
noMatchError: (req) => `addSolanaContractMock: no writeReport mock registered for receiver ${describeReceiver(req.receiver)}`,
|
|
47
|
-
handle: (req) => {
|
|
48
|
-
if (typeof mock.writeReport !== 'function') {
|
|
49
|
-
throw new Error(`addSolanaContractMock: no writeReport handler set for ${programIdLabel}`);
|
|
50
|
-
}
|
|
51
|
-
if (!req.report) {
|
|
52
|
-
throw new Error(`addSolanaContractMock: writeReport called without report for ${programIdLabel}`);
|
|
53
|
-
}
|
|
54
|
-
return mock.writeReport({
|
|
55
|
-
receiver: req.receiver,
|
|
56
|
-
report: req.report,
|
|
57
|
-
remainingAccounts: req.remainingAccounts,
|
|
58
|
-
computeConfig: req.computeConfig,
|
|
59
|
-
});
|
|
60
|
-
},
|
|
61
|
-
});
|
|
62
|
-
return mock;
|
|
63
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { ReportRequestJson } from '../../../../generated/sdk/v1alpha/sdk_pb';
|
|
2
|
-
/**
|
|
3
|
-
* Report-encoder settings for a chain family (everything in a `ReportRequest`
|
|
4
|
-
* except the payload itself). See `EVM_DEFAULT_REPORT_ENCODER` and
|
|
5
|
-
* `SOLANA_DEFAULT_REPORT_ENCODER` for the per-chain defaults.
|
|
6
|
-
*/
|
|
7
|
-
export type ReportEncoder = Omit<ReportRequestJson, 'encodedPayload'>;
|
|
8
|
-
/**
|
|
9
|
-
* Chain-agnostic core for building a `ReportRequest` from raw payload bytes.
|
|
10
|
-
*
|
|
11
|
-
* Per-chain wrappers (`prepareReportRequest` for EVM hex payloads,
|
|
12
|
-
* `prepareSolanaReportRequest` for Solana Borsh payloads) delegate here so
|
|
13
|
-
* there is a single payload-assembly path.
|
|
14
|
-
*
|
|
15
|
-
* @param payload - The raw payload bytes to be signed.
|
|
16
|
-
* @param reportEncoder - The report encoder settings to use.
|
|
17
|
-
* @returns The prepared report request.
|
|
18
|
-
*/
|
|
19
|
-
export declare const prepareReportRequestFromBytes: (payload: Uint8Array, reportEncoder: ReportEncoder) => ReportRequestJson;
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { bytesToBase64 } from '../../hex-utils';
|
|
2
|
-
/**
|
|
3
|
-
* Chain-agnostic core for building a `ReportRequest` from raw payload bytes.
|
|
4
|
-
*
|
|
5
|
-
* Per-chain wrappers (`prepareReportRequest` for EVM hex payloads,
|
|
6
|
-
* `prepareSolanaReportRequest` for Solana Borsh payloads) delegate here so
|
|
7
|
-
* there is a single payload-assembly path.
|
|
8
|
-
*
|
|
9
|
-
* @param payload - The raw payload bytes to be signed.
|
|
10
|
-
* @param reportEncoder - The report encoder settings to use.
|
|
11
|
-
* @returns The prepared report request.
|
|
12
|
-
*/
|
|
13
|
-
export const prepareReportRequestFromBytes = (payload, reportEncoder) => ({
|
|
14
|
-
encodedPayload: bytesToBase64(payload),
|
|
15
|
-
...reportEncoder,
|
|
16
|
-
});
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
import type { AccountMetaJson, ComputeConfigJson } from '../../../../../generated/capabilities/blockchain/solana/v1alpha/client_pb';
|
|
2
|
-
import type { ReportRequestJson } from '../../../../../generated/sdk/v1alpha/sdk_pb';
|
|
3
|
-
import { type ReportEncoder } from '../report-helpers';
|
|
4
|
-
/**
|
|
5
|
-
* An account passed to the Solana capability's `remainingAccounts` list.
|
|
6
|
-
* Build instances with {@link solanaAccountMeta}; generated bindings convert
|
|
7
|
-
* to the capability's protobuf JSON shape internally.
|
|
8
|
-
*/
|
|
9
|
-
export interface SolanaAccountMeta {
|
|
10
|
-
publicKey: Uint8Array;
|
|
11
|
-
isWritable: boolean;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Compute settings for a Solana write-report request. Mirrors the
|
|
15
|
-
* capability's `ComputeConfig` protobuf JSON shape.
|
|
16
|
-
*/
|
|
17
|
-
export type SolanaComputeConfig = ComputeConfigJson;
|
|
18
|
-
/**
|
|
19
|
-
* The minimal account shape needed by {@link calculateAccountsHash} —
|
|
20
|
-
* only the public key participates in the hash. Structurally compatible
|
|
21
|
-
* with both {@link SolanaAccountMeta} and the capability's protobuf
|
|
22
|
-
* `AccountMeta`.
|
|
23
|
-
*/
|
|
24
|
-
export type SolanaAccountInput = Pick<SolanaAccountMeta, 'publicKey'> & Partial<Pick<SolanaAccountMeta, 'isWritable'>>;
|
|
25
|
-
/**
|
|
26
|
-
* Converts a base58-encoded Solana address to its 32 raw bytes.
|
|
27
|
-
*
|
|
28
|
-
* @param base58Address - The base58-encoded address (validated).
|
|
29
|
-
* @returns The 32-byte public key.
|
|
30
|
-
*/
|
|
31
|
-
export declare const solanaAddressToBytes: (base58Address: string) => Uint8Array;
|
|
32
|
-
/**
|
|
33
|
-
* Builds an account entry for the Solana capability's `remainingAccounts` list.
|
|
34
|
-
*
|
|
35
|
-
* @param publicKey - The account's public key, as 32 raw bytes or a base58 string.
|
|
36
|
-
* @param isWritable - Whether the account is writable. Defaults to false.
|
|
37
|
-
* @returns The account meta.
|
|
38
|
-
*/
|
|
39
|
-
export declare const solanaAccountMeta: (publicKey: Uint8Array | string, isWritable?: boolean) => SolanaAccountMeta;
|
|
40
|
-
/**
|
|
41
|
-
* Converts {@link SolanaAccountMeta} entries to the capability's protobuf
|
|
42
|
-
* JSON `AccountMeta` shape (base64 public keys), as expected by
|
|
43
|
-
* `SolanaClient.writeReport`. Used by generated bindings.
|
|
44
|
-
*/
|
|
45
|
-
export declare const solanaAccountMetasToJson: (accounts: ReadonlyArray<SolanaAccountMeta>) => AccountMetaJson[];
|
|
46
|
-
/**
|
|
47
|
-
* Computes the SHA-256 hash of the concatenated public keys of the given
|
|
48
|
-
* accounts, matching the keystone-forwarder's on-chain account hash
|
|
49
|
-
* verification. Nullish entries are skipped; account order matters.
|
|
50
|
-
*
|
|
51
|
-
* Mirrors Go `bindings.CalculateAccountsHash`.
|
|
52
|
-
*
|
|
53
|
-
* @param accounts - The accounts whose public keys are hashed.
|
|
54
|
-
* @returns The 32-byte account hash.
|
|
55
|
-
*/
|
|
56
|
-
export declare const calculateAccountsHash: (accounts: ReadonlyArray<SolanaAccountInput | null | undefined>) => Uint8Array;
|
|
57
|
-
export interface ForwarderReport {
|
|
58
|
-
/** The 32-byte hash from `calculateAccountsHash`. */
|
|
59
|
-
accountHash: Uint8Array;
|
|
60
|
-
/** The Borsh-encoded report payload the receiver's `on_report` deserializes. */
|
|
61
|
-
payload: Uint8Array;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Borsh-encodes a `ForwarderReport` for the keystone-forwarder:
|
|
65
|
-
* `[32-byte accountHash][u32-LE payload length][payload bytes]`.
|
|
66
|
-
*
|
|
67
|
-
* Mirrors Go `bindings.ForwarderReport.Marshal`.
|
|
68
|
-
*
|
|
69
|
-
* @param report - The account hash and payload to encode.
|
|
70
|
-
* @returns The encoded forwarder report.
|
|
71
|
-
*/
|
|
72
|
-
export declare const encodeForwarderReport: (report: ForwarderReport) => Uint8Array;
|
|
73
|
-
/**
|
|
74
|
-
* Returns the Anchor/Borsh encoding of a Vec whose elements are opaque byte
|
|
75
|
-
* payloads: `[u32-LE element count][concatenated element payloads]`.
|
|
76
|
-
* Each element must already be fully serialized for one Vec item on the wire.
|
|
77
|
-
*
|
|
78
|
-
* Mirrors Go's generated `EncodeBorshVecU32`.
|
|
79
|
-
*
|
|
80
|
-
* @param elementPayloads - The pre-encoded Vec elements.
|
|
81
|
-
* @returns The encoded Vec.
|
|
82
|
-
*/
|
|
83
|
-
export declare const encodeBorshVecU32: (elementPayloads: ReadonlyArray<Uint8Array>) => Uint8Array;
|
|
84
|
-
/**
|
|
85
|
-
* Default values expected by the Solana capability for report encoding.
|
|
86
|
-
* Mirrors the constants emitted by the Go Solana bindings generator.
|
|
87
|
-
*/
|
|
88
|
-
export declare const SOLANA_DEFAULT_REPORT_ENCODER: {
|
|
89
|
-
encoderName: string;
|
|
90
|
-
signingAlgo: string;
|
|
91
|
-
hashingAlgo: string;
|
|
92
|
-
};
|
|
93
|
-
/**
|
|
94
|
-
* Prepares a report request for the Solana capability to pass to `.report()`.
|
|
95
|
-
* Takes raw bytes (typically an encoded `ForwarderReport`), not hex.
|
|
96
|
-
*
|
|
97
|
-
* @param payload - The encoded payload bytes to be signed.
|
|
98
|
-
* @param reportEncoder - The report encoder to use. Defaults to SOLANA_DEFAULT_REPORT_ENCODER.
|
|
99
|
-
* @returns The prepared report request.
|
|
100
|
-
*/
|
|
101
|
-
export declare const prepareSolanaReportRequest: (payload: Uint8Array, reportEncoder?: ReportEncoder) => ReportRequestJson;
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import { bytesToBase64 } from '../../../hex-utils';
|
|
2
|
-
import { sha256 } from '@noble/hashes/sha2';
|
|
3
|
-
import { concatBytes } from '@noble/hashes/utils';
|
|
4
|
-
import { address, getAddressEncoder } from '@solana/addresses';
|
|
5
|
-
import { prepareReportRequestFromBytes } from '../report-helpers';
|
|
6
|
-
const ACCOUNT_HASH_LENGTH = 32;
|
|
7
|
-
const U32_LENGTH = 4;
|
|
8
|
-
// Stateless address encoder; hoisted so the encoder stack isn't rebuilt per call.
|
|
9
|
-
const ADDRESS_ENCODER = getAddressEncoder();
|
|
10
|
-
/** Encodes a number as a little-endian Borsh u32. */
|
|
11
|
-
const u32LE = (value) => {
|
|
12
|
-
const bytes = new Uint8Array(U32_LENGTH);
|
|
13
|
-
new DataView(bytes.buffer).setUint32(0, value, true);
|
|
14
|
-
return bytes;
|
|
15
|
-
};
|
|
16
|
-
/**
|
|
17
|
-
* Converts a base58-encoded Solana address to its 32 raw bytes.
|
|
18
|
-
*
|
|
19
|
-
* @param base58Address - The base58-encoded address (validated).
|
|
20
|
-
* @returns The 32-byte public key.
|
|
21
|
-
*/
|
|
22
|
-
export const solanaAddressToBytes = (base58Address) => new Uint8Array(ADDRESS_ENCODER.encode(address(base58Address)));
|
|
23
|
-
/**
|
|
24
|
-
* Builds an account entry for the Solana capability's `remainingAccounts` list.
|
|
25
|
-
*
|
|
26
|
-
* @param publicKey - The account's public key, as 32 raw bytes or a base58 string.
|
|
27
|
-
* @param isWritable - Whether the account is writable. Defaults to false.
|
|
28
|
-
* @returns The account meta.
|
|
29
|
-
*/
|
|
30
|
-
export const solanaAccountMeta = (publicKey, isWritable = false) => ({
|
|
31
|
-
publicKey: typeof publicKey === 'string' ? solanaAddressToBytes(publicKey) : publicKey,
|
|
32
|
-
isWritable,
|
|
33
|
-
});
|
|
34
|
-
/**
|
|
35
|
-
* Converts {@link SolanaAccountMeta} entries to the capability's protobuf
|
|
36
|
-
* JSON `AccountMeta` shape (base64 public keys), as expected by
|
|
37
|
-
* `SolanaClient.writeReport`. Used by generated bindings.
|
|
38
|
-
*/
|
|
39
|
-
export const solanaAccountMetasToJson = (accounts) => accounts.map((account) => ({
|
|
40
|
-
publicKey: bytesToBase64(account.publicKey),
|
|
41
|
-
isWritable: account.isWritable,
|
|
42
|
-
}));
|
|
43
|
-
/**
|
|
44
|
-
* Computes the SHA-256 hash of the concatenated public keys of the given
|
|
45
|
-
* accounts, matching the keystone-forwarder's on-chain account hash
|
|
46
|
-
* verification. Nullish entries are skipped; account order matters.
|
|
47
|
-
*
|
|
48
|
-
* Mirrors Go `bindings.CalculateAccountsHash`.
|
|
49
|
-
*
|
|
50
|
-
* @param accounts - The accounts whose public keys are hashed.
|
|
51
|
-
* @returns The 32-byte account hash.
|
|
52
|
-
*/
|
|
53
|
-
export const calculateAccountsHash = (accounts) => {
|
|
54
|
-
const publicKeys = accounts.filter((acc) => acc != null).map(({ publicKey }) => publicKey);
|
|
55
|
-
return sha256(concatBytes(...publicKeys));
|
|
56
|
-
};
|
|
57
|
-
/**
|
|
58
|
-
* Borsh-encodes a `ForwarderReport` for the keystone-forwarder:
|
|
59
|
-
* `[32-byte accountHash][u32-LE payload length][payload bytes]`.
|
|
60
|
-
*
|
|
61
|
-
* Mirrors Go `bindings.ForwarderReport.Marshal`.
|
|
62
|
-
*
|
|
63
|
-
* @param report - The account hash and payload to encode.
|
|
64
|
-
* @returns The encoded forwarder report.
|
|
65
|
-
*/
|
|
66
|
-
export const encodeForwarderReport = (report) => {
|
|
67
|
-
if (report.accountHash.length !== ACCOUNT_HASH_LENGTH) {
|
|
68
|
-
throw new Error(`encodeForwarderReport: accountHash must be exactly ${ACCOUNT_HASH_LENGTH} bytes, got ${report.accountHash.length}`);
|
|
69
|
-
}
|
|
70
|
-
return concatBytes(report.accountHash, u32LE(report.payload.length), report.payload);
|
|
71
|
-
};
|
|
72
|
-
/**
|
|
73
|
-
* Returns the Anchor/Borsh encoding of a Vec whose elements are opaque byte
|
|
74
|
-
* payloads: `[u32-LE element count][concatenated element payloads]`.
|
|
75
|
-
* Each element must already be fully serialized for one Vec item on the wire.
|
|
76
|
-
*
|
|
77
|
-
* Mirrors Go's generated `EncodeBorshVecU32`.
|
|
78
|
-
*
|
|
79
|
-
* @param elementPayloads - The pre-encoded Vec elements.
|
|
80
|
-
* @returns The encoded Vec.
|
|
81
|
-
*/
|
|
82
|
-
export const encodeBorshVecU32 = (elementPayloads) => concatBytes(u32LE(elementPayloads.length), ...elementPayloads);
|
|
83
|
-
/**
|
|
84
|
-
* Default values expected by the Solana capability for report encoding.
|
|
85
|
-
* Mirrors the constants emitted by the Go Solana bindings generator.
|
|
86
|
-
*/
|
|
87
|
-
export const SOLANA_DEFAULT_REPORT_ENCODER = {
|
|
88
|
-
encoderName: 'solana',
|
|
89
|
-
signingAlgo: 'ecdsa',
|
|
90
|
-
hashingAlgo: 'keccak256',
|
|
91
|
-
};
|
|
92
|
-
/**
|
|
93
|
-
* Prepares a report request for the Solana capability to pass to `.report()`.
|
|
94
|
-
* Takes raw bytes (typically an encoded `ForwarderReport`), not hex.
|
|
95
|
-
*
|
|
96
|
-
* @param payload - The encoded payload bytes to be signed.
|
|
97
|
-
* @param reportEncoder - The report encoder to use. Defaults to SOLANA_DEFAULT_REPORT_ENCODER.
|
|
98
|
-
* @returns The prepared report request.
|
|
99
|
-
*/
|
|
100
|
-
export const prepareSolanaReportRequest = (payload, reportEncoder = SOLANA_DEFAULT_REPORT_ENCODER) => prepareReportRequestFromBytes(payload, reportEncoder);
|