From b47300b16abea78b7eff8d1ff12fb2965e5d0173 Mon Sep 17 00:00:00 2001 From: Andreas <41449730+nonergodic@users.noreply.github.com> Date: Mon, 1 Apr 2024 14:50:20 -0700 Subject: [PATCH] estimate and set CU budget and priortiy fee (#44) * first stab at better CU cost calculation * further optimize on compute budget * fix: rearrange instructions and set correct verify ix index * formatting * determine and set remaining cu numbers * formatting * Fix backend tests * Move signature verification instruction to the top of the instructions list * Fix backend whitelist --------- Co-authored-by: Abhishek Rajput Co-authored-by: M-Picco --- backend/package.json | 1 + backend/src/utils/fund-transactions.ts | 6 +- backend/yarn.lock | 184 +++++- frontend/claim_sdk/claim.ts | 41 +- frontend/claim_sdk/cu_estimate.ts.txt | 883 +++++++++++++++++++++++++ frontend/claim_sdk/solana.ts | 159 +++-- frontend/integration/api.test.ts | 2 + frontend/integration/api.ts | 2 + frontend/utils/verifyTransaction.ts | 2 +- 9 files changed, 1203 insertions(+), 77 deletions(-) create mode 100644 frontend/claim_sdk/cu_estimate.ts.txt diff --git a/backend/package.json b/backend/package.json index b821deae..b002259e 100644 --- a/backend/package.json +++ b/backend/package.json @@ -19,6 +19,7 @@ "@cosmjs/crypto": "^0.32.3", "@cosmjs/encoding": "^0.32.3", "@influxdata/influxdb-client": "^1.33.2", + "@solana/spl-token": "^0.4.3", "@solana/web3.js": "^1.91.1", "bs58": "^5.0.0", "hi-base32": "^0.5.1", diff --git a/backend/src/utils/fund-transactions.ts b/backend/src/utils/fund-transactions.ts index d744ef15..b2775dcd 100644 --- a/backend/src/utils/fund-transactions.ts +++ b/backend/src/utils/fund-transactions.ts @@ -7,6 +7,7 @@ import { TransactionInstruction, VersionedTransaction } from '@solana/web3.js' +import * as splToken from '@solana/spl-token' import { coder } from '../token-dispenser' import config from '../config' @@ -58,7 +59,8 @@ async function loadWhitelistedProgramIds(): Promise { tokenDispenserPublicKey, Secp256k1Program.programId, Ed25519Program.programId, - ComputeBudgetProgram.programId + ComputeBudgetProgram.programId, + splToken.ASSOCIATED_TOKEN_PROGRAM_ID ] } @@ -140,7 +142,7 @@ export function checkSetComputeBudgetInstructionsAreSetComputeUnitPrice( const priorityFee = ComputeBudgetInstruction.decodeSetComputeUnitPrice( legacTransactionInstruction ) - if (priorityFee.microLamports >= MAX_COMPUTE_UNIT_PRICE) { + if (priorityFee.microLamports > MAX_COMPUTE_UNIT_PRICE) { console.error('Priority fee set is too high') return false } diff --git a/backend/yarn.lock b/backend/yarn.lock index f3b086df..978921c0 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -1679,13 +1679,178 @@ "@smithy/util-buffer-from" "^2.2.0" tslib "^2.6.2" -"@solana/buffer-layout@^4.0.1": +"@solana/buffer-layout-utils@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@solana/buffer-layout-utils/-/buffer-layout-utils-0.2.0.tgz#b45a6cab3293a2eb7597cceb474f229889d875ca" + integrity sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g== + dependencies: + "@solana/buffer-layout" "^4.0.0" + "@solana/web3.js" "^1.32.0" + bigint-buffer "^1.1.5" + bignumber.js "^9.0.1" + +"@solana/buffer-layout@^4.0.0", "@solana/buffer-layout@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz#b996235eaec15b1e0b5092a8ed6028df77fa6c15" integrity sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA== dependencies: buffer "~6.0.3" +"@solana/codecs-core@2.0.0-experimental.8618508": + version "2.0.0-experimental.8618508" + resolved "https://registry.yarnpkg.com/@solana/codecs-core/-/codecs-core-2.0.0-experimental.8618508.tgz#4f6709dd50e671267f3bea7d09209bc6471b7ad0" + integrity sha512-JCz7mKjVKtfZxkuDtwMAUgA7YvJcA2BwpZaA1NOLcted4OMC4Prwa3DUe3f3181ixPYaRyptbF0Ikq2MbDkYEA== + +"@solana/codecs-core@2.0.0-preview.2": + version "2.0.0-preview.2" + resolved "https://registry.yarnpkg.com/@solana/codecs-core/-/codecs-core-2.0.0-preview.2.tgz#689784d032fbc1fedbde40bb25d76cdcecf6553b" + integrity sha512-gLhCJXieSCrAU7acUJjbXl+IbGnqovvxQLlimztPoGgfLQ1wFYu+XJswrEVQqknZYK1pgxpxH3rZ+OKFs0ndQg== + dependencies: + "@solana/errors" "2.0.0-preview.2" + +"@solana/codecs-data-structures@2.0.0-experimental.8618508": + version "2.0.0-experimental.8618508" + resolved "https://registry.yarnpkg.com/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-experimental.8618508.tgz#c16a704ac0f743a2e0bf73ada42d830b3402d848" + integrity sha512-sLpjL9sqzaDdkloBPV61Rht1tgaKq98BCtIKRuyscIrmVPu3wu0Bavk2n/QekmUzaTsj7K1pVSniM0YqCdnEBw== + dependencies: + "@solana/codecs-core" "2.0.0-experimental.8618508" + "@solana/codecs-numbers" "2.0.0-experimental.8618508" + +"@solana/codecs-data-structures@2.0.0-preview.2": + version "2.0.0-preview.2" + resolved "https://registry.yarnpkg.com/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-preview.2.tgz#e82cb1b6d154fa636cd5c8953ff3f32959cc0370" + integrity sha512-Xf5vIfromOZo94Q8HbR04TbgTwzigqrKII0GjYr21K7rb3nba4hUW2ir8kguY7HWFBcjHGlU5x3MevKBOLp3Zg== + dependencies: + "@solana/codecs-core" "2.0.0-preview.2" + "@solana/codecs-numbers" "2.0.0-preview.2" + "@solana/errors" "2.0.0-preview.2" + +"@solana/codecs-numbers@2.0.0-experimental.8618508": + version "2.0.0-experimental.8618508" + resolved "https://registry.yarnpkg.com/@solana/codecs-numbers/-/codecs-numbers-2.0.0-experimental.8618508.tgz#d84f9ed0521b22e19125eefc7d51e217fcaeb3e4" + integrity sha512-EXQKfzFr3CkKKNzKSZPOOOzchXsFe90TVONWsSnVkonO9z+nGKALE0/L9uBmIFGgdzhhU9QQVFvxBMclIDJo2Q== + dependencies: + "@solana/codecs-core" "2.0.0-experimental.8618508" + +"@solana/codecs-numbers@2.0.0-preview.2": + version "2.0.0-preview.2" + resolved "https://registry.yarnpkg.com/@solana/codecs-numbers/-/codecs-numbers-2.0.0-preview.2.tgz#56995c27396cd8ee3bae8bd055363891b630bbd0" + integrity sha512-aLZnDTf43z4qOnpTcDsUVy1Ci9im1Md8thWipSWbE+WM9ojZAx528oAql+Cv8M8N+6ALKwgVRhPZkto6E59ARw== + dependencies: + "@solana/codecs-core" "2.0.0-preview.2" + "@solana/errors" "2.0.0-preview.2" + +"@solana/codecs-strings@2.0.0-experimental.8618508": + version "2.0.0-experimental.8618508" + resolved "https://registry.yarnpkg.com/@solana/codecs-strings/-/codecs-strings-2.0.0-experimental.8618508.tgz#72457b884d9be80b59b263bcce73892b081e9402" + integrity sha512-b2yhinr1+oe+JDmnnsV0641KQqqDG8AQ16Z/x7GVWO+AWHMpRlHWVXOq8U1yhPMA4VXxl7i+D+C6ql0VGFp0GA== + dependencies: + "@solana/codecs-core" "2.0.0-experimental.8618508" + "@solana/codecs-numbers" "2.0.0-experimental.8618508" + +"@solana/codecs-strings@2.0.0-preview.2": + version "2.0.0-preview.2" + resolved "https://registry.yarnpkg.com/@solana/codecs-strings/-/codecs-strings-2.0.0-preview.2.tgz#8bd01a4e48614d5289d72d743c3e81305d445c46" + integrity sha512-EgBwY+lIaHHgMJIqVOGHfIfpdmmUDNoNO/GAUGeFPf+q0dF+DtwhJPEMShhzh64X2MeCZcmSO6Kinx0Bvmmz2g== + dependencies: + "@solana/codecs-core" "2.0.0-preview.2" + "@solana/codecs-numbers" "2.0.0-preview.2" + "@solana/errors" "2.0.0-preview.2" + +"@solana/codecs@2.0.0-preview.2": + version "2.0.0-preview.2" + resolved "https://registry.yarnpkg.com/@solana/codecs/-/codecs-2.0.0-preview.2.tgz#d6615fec98f423166fb89409f9a4ad5b74c10935" + integrity sha512-4HHzCD5+pOSmSB71X6w9ptweV48Zj1Vqhe732+pcAQ2cMNnN0gMPMdDq7j3YwaZDZ7yrILVV/3+HTnfT77t2yA== + dependencies: + "@solana/codecs-core" "2.0.0-preview.2" + "@solana/codecs-data-structures" "2.0.0-preview.2" + "@solana/codecs-numbers" "2.0.0-preview.2" + "@solana/codecs-strings" "2.0.0-preview.2" + "@solana/options" "2.0.0-preview.2" + +"@solana/errors@2.0.0-preview.2": + version "2.0.0-preview.2" + resolved "https://registry.yarnpkg.com/@solana/errors/-/errors-2.0.0-preview.2.tgz#e0ea8b008c5c02528d5855bc1903e5e9bbec322e" + integrity sha512-H2DZ1l3iYF5Rp5pPbJpmmtCauWeQXRJapkDg8epQ8BJ7cA2Ut/QEtC3CMmw/iMTcuS6uemFNLcWvlOfoQhvQuA== + dependencies: + chalk "^5.3.0" + commander "^12.0.0" + +"@solana/options@2.0.0-experimental.8618508": + version "2.0.0-experimental.8618508" + resolved "https://registry.yarnpkg.com/@solana/options/-/options-2.0.0-experimental.8618508.tgz#95385340e85f9e8a81b2bfba089404a61c8e9520" + integrity sha512-fy/nIRAMC3QHvnKi63KEd86Xr/zFBVxNW4nEpVEU2OT0gCEKwHY4Z55YHf7XujhyuM3PNpiBKg/YYw5QlRU4vg== + dependencies: + "@solana/codecs-core" "2.0.0-experimental.8618508" + "@solana/codecs-numbers" "2.0.0-experimental.8618508" + +"@solana/options@2.0.0-preview.2": + version "2.0.0-preview.2" + resolved "https://registry.yarnpkg.com/@solana/options/-/options-2.0.0-preview.2.tgz#13ff008bf43a5056ef9a091dc7bb3f39321e867e" + integrity sha512-FAHqEeH0cVsUOTzjl5OfUBw2cyT8d5Oekx4xcn5hn+NyPAfQJgM3CEThzgRD6Q/4mM5pVUnND3oK/Mt1RzSE/w== + dependencies: + "@solana/codecs-core" "2.0.0-preview.2" + "@solana/codecs-numbers" "2.0.0-preview.2" + +"@solana/spl-token-group@^0.0.2": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@solana/spl-token-group/-/spl-token-group-0.0.2.tgz#23f754fd535a4df5e2b80293a03aabd58bd99167" + integrity sha512-vLePrFvT9+PfK2KZaddPebTWtRykXUR+060gqomFUcBk/2UPpZtsJGW+xshI9z9Ryrx7FieprZEUCApw34BwrQ== + dependencies: + "@solana/codecs" "2.0.0-preview.2" + "@solana/spl-type-length-value" "0.1.0" + +"@solana/spl-token-metadata@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@solana/spl-token-metadata/-/spl-token-metadata-0.1.2.tgz#876e13432bd2960bd3cac16b9b0af63e69e37719" + integrity sha512-hJYnAJNkDrtkE2Q41YZhCpeOGU/0JgRFXbtrtOuGGeKc3pkEUHB9DDoxZAxx+XRno13GozUleyBi0qypz4c3bw== + dependencies: + "@solana/codecs-core" "2.0.0-experimental.8618508" + "@solana/codecs-data-structures" "2.0.0-experimental.8618508" + "@solana/codecs-numbers" "2.0.0-experimental.8618508" + "@solana/codecs-strings" "2.0.0-experimental.8618508" + "@solana/options" "2.0.0-experimental.8618508" + "@solana/spl-type-length-value" "0.1.0" + +"@solana/spl-token@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@solana/spl-token/-/spl-token-0.4.3.tgz#cb923184fcba3f875f5914a440a68d7f537d0bac" + integrity sha512-mRjJJE9CIBejsg9WAmDp369pWeObm42K2fwsZ4dkJAMCt1KBPb5Eb1vzM5+AYfV/BUTy3QP2oFx8kV+8Doa1xQ== + dependencies: + "@solana/buffer-layout" "^4.0.0" + "@solana/buffer-layout-utils" "^0.2.0" + "@solana/spl-token-group" "^0.0.2" + "@solana/spl-token-metadata" "^0.1.2" + buffer "^6.0.3" + +"@solana/spl-type-length-value@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@solana/spl-type-length-value/-/spl-type-length-value-0.1.0.tgz#b5930cf6c6d8f50c7ff2a70463728a4637a2f26b" + integrity sha512-JBMGB0oR4lPttOZ5XiUGyvylwLQjt1CPJa6qQ5oM+MBCndfjz2TKKkw0eATlLLcYmq1jBVsNlJ2cD6ns2GR7lA== + dependencies: + buffer "^6.0.3" + +"@solana/web3.js@^1.32.0": + version "1.91.3" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.91.3.tgz#25b8b9dfd88bfa6441c0c02bbdb67abd32bfa0f4" + integrity sha512-Z6FZyW8SWm7RXW5ZSyr1kmpR+eH/F4DhgxV4WPaq5AbAAMnCiiGm36Jb7ACHFXtWzq1a24hBkJ1wnVANjsmdPA== + dependencies: + "@babel/runtime" "^7.23.4" + "@noble/curves" "^1.2.0" + "@noble/hashes" "^1.3.3" + "@solana/buffer-layout" "^4.0.1" + agentkeepalive "^4.5.0" + bigint-buffer "^1.1.5" + bn.js "^5.2.1" + borsh "^0.7.0" + bs58 "^4.0.1" + buffer "6.0.3" + fast-stable-stringify "^1.0.0" + jayson "^4.1.0" + node-fetch "^2.7.0" + rpc-websockets "^7.5.1" + superstruct "^0.14.2" + "@solana/web3.js@^1.68.0", "@solana/web3.js@^1.91.1": version "1.91.1" resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.91.1.tgz#d49d2f982b52070be3b987fd8d892fcbddd064b5" @@ -2549,6 +2714,11 @@ bigint-buffer@^1.1.5: dependencies: bindings "^1.3.0" +bignumber.js@^9.0.1: + version "9.1.2" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" + integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== + bin-check@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/bin-check/-/bin-check-4.1.0.tgz#fc495970bdc88bb1d5a35fc17e65c4a149fc4a49" @@ -2705,7 +2875,7 @@ buffer-layout@^1.2.0, buffer-layout@^1.2.2: resolved "https://registry.yarnpkg.com/buffer-layout/-/buffer-layout-1.2.2.tgz#b9814e7c7235783085f9ca4966a0cfff112259d5" integrity sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA== -buffer@6.0.3, buffer@~6.0.3: +buffer@6.0.3, buffer@^6.0.3, buffer@~6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== @@ -2809,6 +2979,11 @@ chalk@^4.0.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + char-regex@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" @@ -2894,6 +3069,11 @@ colorette@^2.0.20: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== +commander@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-12.0.0.tgz#b929db6df8546080adfd004ab215ed48cf6f2592" + integrity sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA== + commander@^2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" diff --git a/frontend/claim_sdk/claim.ts b/frontend/claim_sdk/claim.ts index a8353018..fce8d12e 100644 --- a/frontend/claim_sdk/claim.ts +++ b/frontend/claim_sdk/claim.ts @@ -5,17 +5,7 @@ import { ethers } from 'ethers' import { base32decode, removeLeading0x } from './index' // Must be kept in line with the database types and the on-chain program -export type Ecosystem = - | 'discord' - | 'solana' - | 'evm' - | 'sui' - | 'algorand' - | 'aptos' - | 'terra' - | 'osmosis' - | 'injective' -export const Ecosystems: Ecosystem[] = [ +export const Ecosystems = [ 'discord', 'solana', 'evm', @@ -25,7 +15,8 @@ export const Ecosystems: Ecosystem[] = [ 'terra', 'osmosis', 'injective', -] +] as const +export type Ecosystem = typeof Ecosystems[number] export class ClaimInfo { constructor( @@ -56,16 +47,11 @@ export class ClaimInfo { } break } - case 'osmosis': - case 'terra': { - identityStruct = { - cosmwasm: { address: this.identity }, - } - break - } - case 'injective': { + case 'sui': { identityStruct = { - injective: { address: this.identity }, + sui: { + address: Buffer.from(removeLeading0x(this.identity), 'hex'), + }, } break } @@ -77,11 +63,16 @@ export class ClaimInfo { } break } - case 'sui': { + case 'terra': + case 'osmosis': { identityStruct = { - sui: { - address: Buffer.from(removeLeading0x(this.identity), 'hex'), - }, + cosmwasm: { address: this.identity }, + } + break + } + case 'injective': { + identityStruct = { + injective: { address: this.identity }, } break } diff --git a/frontend/claim_sdk/cu_estimate.ts.txt b/frontend/claim_sdk/cu_estimate.ts.txt new file mode 100644 index 00000000..87e30ed7 --- /dev/null +++ b/frontend/claim_sdk/cu_estimate.ts.txt @@ -0,0 +1,883 @@ +//csv data that derives the actual compute cost numbers +// Saved with formulas - can be loaded into open office. +// Uses typescript code below to determine bumps and subtracts bump derivation +// costs to estimate raw program execution costs. +// This file represents an 80-20 clean-up. It's just clean enough so one can +// go back and figure out how things were derived in the first place without +// spending any additional time/energy on it now. +// +// ,ata init in prog,only deriv,ata creation,,separate,normal deriv,,,Program +// 255,33220,7246,20460,=B2-C2,=B2-C2+806,0,,1,waNTLJXETasWVTP1qj84Zs6h7XY8qvzqmKd1QWqxyLB +// =A2-1,=B2+4500,=C2+1500,=D2+1500,=B3-C3,=F2+4500,=G2+1500,,2,WA6TpiY1gcAxRAjz5rQeVeZzgHtJKSnRZsJoocFCEGU +// =A3-1,=B3+4500,=C3+1500,=D3+1500,=B4-C4,=F3+4500,=G3+1500,,3,WAPGu4AoTGCYbp1iXnZTpBn89VkJNJX3jY7uPuUZAv7 +// =A4-1,=B4+4500,=C4+1500,=D4+1500,=B5-C5,=F4+4500,=G4+1500,,, +// =A5-1,=B5+4500,=C5+1500,=D5+1500,=B6-C6,=F5+4500,=G5+1500,,, +// =A6-1,=B6+4500,=C6+1500,=D6+1500,=B7-C7,=F6+4500,=G6+1500,,, +// =A7-1,=B7+4500,=C7+1500,=D7+1500,=B8-C8,=F7+4500,=G7+1500,,, +// =A8-1,=B8+4500,=C8+1500,=D8+1500,=B9-C9,=F8+4500,=G8+1500,,, +// =A9-1,=B9+4500,=C9+1500,=D9+1500,=B10-C10,=F9+4500,=G9+1500,,, +// =A10-1,=B10+4500,=C10+1500,=D10+1500,=B11-C11,=F10+4500,=G10+1500,,, +// ,,,,,col above is empirical,,,, +// program,discord:,,,,,,,, +// 1,88876,=F6,=G2,=B14-C14-D14,3PYnssaWxjCXRQYBZHXsowJSCEaYHd1McH2GT3v5Jk7GaxbMCNRC54FF5qnpoPt1dkik8GgzJEhyJG4RQcd5mSCi,,,, +// 1,72451,=F2,=G3,=B15-C15-D15,U2zuQn7sDkNz6NZMVrEqTjPqNHG4zWDLqHh8CVuhqGutCr8WZ5eqqmLhTjZmhkMCZNLxRjJ3RhR7fTUGkJAHd1E,,,, +// 1,76954,=F3,=G3,=B16-C16-D16,573ui4vx3Avd8WpANYeUYwNdhcyj4FfY5P6QYRKPfrWNsqTaYRjzh2259J3tAQA6g1EctTfCsT5vzLtQNQhCQko4,,,, +// 1,47036,0,3000,=B17-C17-D17,4ERr2CdGa4ZmmVv4He8wmQXRzxjeGqpvEWFfSFoPbB7ohxGozJBc2vs9hZrKwWDXSQstint9LWc7poLYUuEt6GUu,,,, +// ,,,,,,,,, +// ,evm:,,,,,,,, +// 1,67976,0,=G3,=B20-C20-D20,3w4NM3fqxn2AfDa6c3P2kHsa2WzqQzbN3zH1wAVh63VYiFuHmKWDDk94Scgbjx6YGRJANVXStytXa9DjYRKVWpwZ,,,, +// 1,68024,0,=G3,=B21-C21-D21,2ZoVWD1ToZVswUtkRDkPRAHzZGVGwgH66tfxLbswrJxnCcZjhYwsFCaZEsV2BWPBueh9TKB1UAFmkm82DKPKRoo9,,,, +// 1,68021,0,=G3,=B22-C22-D22,jucMMWFaafZD3F8MRutRJVkoqMfgzW53VHxRf5Jh79aBDGX7uwEDW1R4uDkSy3aVvRzoigSSRbatYDw5RijTDqp,,,, +// 1,75482,0,=G8,=B23-C23-D23,3vyc2UPgCiPT67mHTDjpiKmHPLQukGtp44GbmBpVVKV85nZyTba2xKtN9ZKRJdxVTuLSJuHwA1u1kwKWBRJsiFXT,,,, +// 1,93346,=F2,=G2,=B24-C24-D24,4BfPPiHHm7Neq2utLb4zqKqAXWnz6nzAi8quRAwpRaaNXrcvQo3Ny99PzRjSULYmxNc8gzcYRS66FL1hVRjSG8bk,,,, +// 1,66446,0,=G2,=B25-C25-D25,4zKUWGufk9WZpGpNxVSU9QFTo44QKAQsM6Qf5YEBRg4fNZqJc1eckQUUjue3LXA8WAAAEECQth8KKrkHTMsHcFQX,,,, +// 1,93265,=F2,=G2,=B26-C26-D26,2W39xBYrMkuPYfBtuYizp9FmWzWQduwhF7xn8nfgtD534z5bmkcX8YyyGRzyehg1uiaDfgJ5o3YnL4k7yNjHKVbS,,,, +// 2,93239,=F2,=G2,=B27-C27-D27,5YjAyoDd8m8bmc7zD17imJWYRc4dg2HeyVWSL48i3647moJfontGmJwU7snpDTc4MqiqQx6AdMEW7rGeUQfzgW6e,,,, +// 2,96106,=F2,=G4,=B28-C28-D28,hPruXEKJXFiwDNuLKqQuHt1BsygbdZHST4LXh9E52Bv2MusCzmC3S3ZAFvANjfjKkXBV7fedP3iMeDUpp8N5K52,,,, +// 2,93294,=F2,=G2,=B29-C29-D29,ouVLq5CMmrU76jghoEYFGjSivzf6noiVLqegUfjYEurgb9rRdnqqjzNcVXQUyWXttuuhoW9pV6yFVFBkjcNUMpr,,,, +// 2,97651,=F2,=G5,=B30-C30-D30,4zG76KQU3QZdpZEvfHQwfSwtN45LhM3ipPqxd58BTmvBdVxAGSMBs5QwL7dTHmBrksn9wp7z28GPMKhKBTf3skfp,,,, +// 2,102278,=F4,=G2,=B31-C31-D31,3pfztkbaUsHgpdNqwoAdAHksbs86y3odDn3tmyWjNRk5nyuHESCrYWddmqursKZStb94FQ7DrUg4wfgi1tuUMPgC,,,, +// 2,117200,=F7,=G3,=B32-C32-D32,3KoMAff3MuuoMRP2jhZCaCvBRfKHumaWG8Mmc1xbpQQYHwDkF28PphiWxS3tc5wTnwP1nT67LvNGYd6UdJeRbFXH,,,, +// ,,,,,,,,, +// ,solana:,,,,,,,, +// 2,73225,=F3,=G3,=B35-C35-D35,D1G125KsundqAvP9yGvbh5mr2tkYFik3o41kAQJTkQmz9GtVFKC6HK4Qd22sA7RRA3uWVGvRkr4PRZXUHnitMEZ,,,, +// 2,47945,0,=G7,=B36-C36-D36,3C4UNJLx71GSRCiJQ5b4LyW2DJrmvXsaNH7tidWdwZYrLQ2z7yufzTY8ssfV9asDzyzgpe4XkEicLqdL9pLyGPwx,,,, +// 2,44948,=G4,=G3,=B37-C37-D37,4uWbYwSZ5g3mBC2doAQVQJ9foRuBgXUf9sa1SteLdaU5zWB9WhvBmpPXgji2u8RBKfa3xLhPJmJLEdxx6YabL4Gw,,,, +// 2,50948,=G7,=G4,=B38-C38-D38,34vrzPudC4kZ4rsPSjjZG9pZRxxgeeV9KmSbbufMuwTXowoFcS7QuEtMDQwMNF4cygxRnB8uCGpvKBwF8ELpgcin,,,, +// 2,67222,=F2,=G2,=B39-C39-D39,5UURwBtJW8G4dQQh6qh6B4WmNP8NsiiCDVYuz4ydy5pyfqbBp3SWCXbAzZhVWygVnZsju5n4ZyT8BucebRz5UaUs,,,, +// 2,82225,=F4,=G6,=B40-C40-D40,5KkvmT5PrGv2xUmNyw1te6rJtjMQdNHEA8dydEsY2ECD9yubGoyLgUe1tEb8f7wfzgMveNbsPfyPKpbvti44bHMa,,,, +// ,,,,,,,,, +// ,aptos:,,,,,,,, +// 1,78710,=G2,=G2,=B43-C43-D43,58e2fgsMAtwxNvv3wVRWbJuJdnwFx2thXxyEdtF5ZgeHq5g5FMD5m5fCbbhjEV4BpZD8kkt3wy1Nj1FuTAsyJehP,,,, +// 2,81645,=G4,=G2,=B44-C44-D44,bGbB8ugagCavqPFBSvTCat9GCD8Kqz3J317dYW2STAmzPs9xMkXLgehUyr1PSutT3H5PoZZyyUayPTJHaS3eNUs,,,, +// 2,87570,=G7,=G3,=B45-C45-D45,3w5hkXCKY2uy4tATGu457An8uBrZ1hB85Vw2hcmULqgESBZdX81WqNCuFzVH7v2Wc7EmQz8PeyuguSFBReH918nR,,,, +// ,,,,,,,,, +// ,sui:,,,,,,,, +// 2,88122,=G4,=G6,=B48-C48-D48,5zy8wHfF3GMdPu9kLvyTBg46TszMxuRAoeBrcfYjbuxpnKw1TdEqnRFak7H9AKy523J653PEcHXjF2AmdMgh6sQf,,,, +// 3,79025,=G2,=G2,=B49-C49-D49,3JQapHPhJAvfEq2UV9ywnmaSLPDrzQtNrJPudqSmXBpUmf6N5svAQWWKTbKVHYNp4ZoEAnY1hr3ibfvB2WpBkABD,,,, +// ,,,,,,,,, +// ,cosmos:,,,,,,,, +// 1,116139,0,=G4,=B52-C52-D52,3be6wQGM8FdDLMZm63r9YSMeXTZsAskrKvLKopDDCX8EHmCnjc9GGM28ArJRFRcs6uov7i3nSeKod4HsjtQ6swUS,,,, +// 2,117609,=G4,=G3,=B53-C53-D53,3tqaAQBYmvHS2Dri9q1Fcg5SPBTBvaqWxqcMKiGyuuE8DJJXBZfH8dpxv1FGz5SYJV6SKoU75M7VtNLBkteCQn15,,,, +// 2,116074,=G4,=G2,=B54-C54-D54,4m5Lm9PcLY9r5RdYrFfpVdn9H9bxYSRnXrZxjoK4L3PL5j5WQfbm2fLNt8JRUVSQSCruT98eUdooTmbg4JAk7vxP,,,, +// 3,144331,=F2,=G5,=B55-C55-D55,5i7xkSQjnar5vNTKddSdL6aVxuYD44Q1etYynfJuV2VFsQqcTGpfPeeo6qJqkWfDSGfP6fX9XWhaN6p8wTBiAfcF,,,, +// ,,,,,,,,, +// ,terra:,,,,,,,, +// 1,113377,=G2,=G2,=B58-C58-D58,258c3CH8aHktZUUCtJHR8QNqEv5L1QaJB39YPs64dpt6ByeH84mB4xWw9tMEkJD6dcnys4iUuasnJfhpMED7Ge6z,,,, +// 1,141381,=F2,=G3,=B59-C59-D59,23HfzzuQBjSUDkLtM1VXeji3oT7ymDm6i8psudVuyxhkgedKEiVzqrpzsGT68ut5d9Qn2EdHNvT5aoaXQoQwRaDm,,,, +// 2,116350,=G4,=G2,=B60-C60-D60,wLcgmj3mhtrjjdinCJJgbYioiaiuNnrTWqTiKpDpC9x6AvSMn6KzTEWXB89VoPk7D5vCEcQvTwyWwkRCaqCHWgm,,,, +// 2,117853,=G4,=G3,=B61-C61-D61,4P65T1mw1YYgY53Xcyuu373MMoFCDzro8j2YWjMx6anY86XQ6F1qvrpZtLK5a1fAntyB7bBdfZ2NryAs8jBttn2J,,,, +// ,,,,,,,,, +// ,injective:,,,,,,,, +// 1,73155,0,=G3,=B64-C64-D64,5R1GrqETt7Cr5ebNhzAVX9SgvmToo8ZoL7t3n2nZUoCDnMFC7yRsp7sjqF9UVX6zug8fKS2PADZaTMFKSt2Ltawf,,,, +// 2,76147,=G4,=G3,=B65-C65-D65,5xRyfymFQBL6hKgACFfsxkhEy9Jbxmja236P7VgwKHgVgNAZqmw3yLwST4CiADWKTkA75iuLc8YJN3Tsm8XfkMRm,,,, +// ,,,,,,,,, +// ,algorand,,,,,,,, +// 3,70590,=G2,=G2,=B68-C68-D68,2LCat1JPttHvrzTUUXwLz4YGx5gWszQpoHcz9cQuXpuFX1b6pFdfx3CV9yyexrwv4gZh5YnSUJiaGyoFEU5TaQnN,,,, + +//############################################################################# + +// program output: + +// tx: 3PYnssaWxjCXRQYBZHXsowJSCEaYHd1McH2GT3v5Jk7GaxbMCNRC54FF5qnpoPt1dkik8GgzJEhyJG4RQcd5mSCi +// program: waNTLJXETasWVTP1qj84Zs6h7XY8qvzqmKd1QWqxyLB +// ata: 9DSf7q55crkvaCMKFNh6MkFy3K9ab2TAxCPxpkoHLu2m +// xpct: 9DSf7q55crkvaCMKFNh6MkFy3K9ab2TAxCPxpkoHLu2m +// bump: 251 +// rPda: MuNQAviUg6ZFvWp9Ft5PHchiMHeWE99mqw5zyMQzm7x +// xpct: MuNQAviUg6ZFvWp9Ft5PHchiMHeWE99mqw5zyMQzm7x +// bump: 255 +// ================================================================================ +// tx: U2zuQn7sDkNz6NZMVrEqTjPqNHG4zWDLqHh8CVuhqGutCr8WZ5eqqmLhTjZmhkMCZNLxRjJ3RhR7fTUGkJAHd1E +// program: waNTLJXETasWVTP1qj84Zs6h7XY8qvzqmKd1QWqxyLB +// ata: 3xwGBStS3QX5hGmxweKaZgPK7QTLcEJG7YV2XYKGB3jr +// xpct: 3xwGBStS3QX5hGmxweKaZgPK7QTLcEJG7YV2XYKGB3jr +// bump: 255 +// rPda: BoSoN8zrkjva2BqaPnoshkhLB1AxLz6oe76x1zMo87X5 +// xpct: BoSoN8zrkjva2BqaPnoshkhLB1AxLz6oe76x1zMo87X5 +// bump: 254 +// ================================================================================ +// tx: 573ui4vx3Avd8WpANYeUYwNdhcyj4FfY5P6QYRKPfrWNsqTaYRjzh2259J3tAQA6g1EctTfCsT5vzLtQNQhCQko4 +// program: waNTLJXETasWVTP1qj84Zs6h7XY8qvzqmKd1QWqxyLB +// ata: qYSg66vZNiAEy8k2SXBgxjnwiR8MR8N6vSP6YJWg73n +// xpct: qYSg66vZNiAEy8k2SXBgxjnwiR8MR8N6vSP6YJWg73n +// bump: 254 +// rPda: G9cpkCBzMcp7h3dZN6wLT8mRX8iDB4m8gd4T3cumHLdw +// xpct: G9cpkCBzMcp7h3dZN6wLT8mRX8iDB4m8gd4T3cumHLdw +// bump: 254 +// ================================================================================ +// tx: 4ERr2CdGa4ZmmVv4He8wmQXRzxjeGqpvEWFfSFoPbB7ohxGozJBc2vs9hZrKwWDXSQstint9LWc7poLYUuEt6GUu +// program: waNTLJXETasWVTP1qj84Zs6h7XY8qvzqmKd1QWqxyLB +// ata: 27VpCTrNdKAcsWE72gxxBPBFXAGcAMLgbPaLLyQXfzHk +// xpct: 27VpCTrNdKAcsWE72gxxBPBFXAGcAMLgbPaLLyQXfzHk +// bump: 255 +// rPda: 2FSYp5oRWcUtCjBrij49YL7BZXiugknE2pEdFJAgdWdr +// xpct: 2FSYp5oRWcUtCjBrij49YL7BZXiugknE2pEdFJAgdWdr +// bump: 253 +// ================================================================================ +// tx: 3w4NM3fqxn2AfDa6c3P2kHsa2WzqQzbN3zH1wAVh63VYiFuHmKWDDk94Scgbjx6YGRJANVXStytXa9DjYRKVWpwZ +// program: waNTLJXETasWVTP1qj84Zs6h7XY8qvzqmKd1QWqxyLB +// ata: 8zfuxc7A4qw6UBYTU8nnmymfAPzxyQPiMNcTfea8oS3 +// xpct: 8zfuxc7A4qw6UBYTU8nnmymfAPzxyQPiMNcTfea8oS3 +// bump: 255 +// rPda: 3yqmGaXpcGfavuL4SVwrffAuH48kL9oS2bLAN86TQ58Q +// xpct: 3yqmGaXpcGfavuL4SVwrffAuH48kL9oS2bLAN86TQ58Q +// bump: 254 +// ================================================================================ +// tx: 2ZoVWD1ToZVswUtkRDkPRAHzZGVGwgH66tfxLbswrJxnCcZjhYwsFCaZEsV2BWPBueh9TKB1UAFmkm82DKPKRoo9 +// program: waNTLJXETasWVTP1qj84Zs6h7XY8qvzqmKd1QWqxyLB +// ata: G8P8sNvyZeSurzntNEBKUdYuhfZXDGyZLhQqNF3SY2sD +// xpct: G8P8sNvyZeSurzntNEBKUdYuhfZXDGyZLhQqNF3SY2sD +// bump: 255 +// rPda: 4yhfTbWg7cyucVRPzftSoyhqetv9urjpJwgFBNrpvdRG +// xpct: 4yhfTbWg7cyucVRPzftSoyhqetv9urjpJwgFBNrpvdRG +// bump: 254 +// ================================================================================ +// tx: jucMMWFaafZD3F8MRutRJVkoqMfgzW53VHxRf5Jh79aBDGX7uwEDW1R4uDkSy3aVvRzoigSSRbatYDw5RijTDqp +// program: waNTLJXETasWVTP1qj84Zs6h7XY8qvzqmKd1QWqxyLB +// ata: G8P8sNvyZeSurzntNEBKUdYuhfZXDGyZLhQqNF3SY2sD +// xpct: G8P8sNvyZeSurzntNEBKUdYuhfZXDGyZLhQqNF3SY2sD +// bump: 255 +// rPda: 7yXVeoRk7C5HV6vMWrbtRr73kREviv79YPUAcSKQC3Bc +// xpct: 7yXVeoRk7C5HV6vMWrbtRr73kREviv79YPUAcSKQC3Bc +// bump: 254 +// ================================================================================ +// tx: 3vyc2UPgCiPT67mHTDjpiKmHPLQukGtp44GbmBpVVKV85nZyTba2xKtN9ZKRJdxVTuLSJuHwA1u1kwKWBRJsiFXT +// program: waNTLJXETasWVTP1qj84Zs6h7XY8qvzqmKd1QWqxyLB +// ata: 8zfuxc7A4qw6UBYTU8nnmymfAPzxyQPiMNcTfea8oS3 +// xpct: 8zfuxc7A4qw6UBYTU8nnmymfAPzxyQPiMNcTfea8oS3 +// bump: 255 +// rPda: 9jVoQgUwrKAeQ864jKd2onJ87c6WB34GcZ2D6PaQo28f +// xpct: 9jVoQgUwrKAeQ864jKd2onJ87c6WB34GcZ2D6PaQo28f +// bump: 249 +// ================================================================================ +// tx: 4BfPPiHHm7Neq2utLb4zqKqAXWnz6nzAi8quRAwpRaaNXrcvQo3Ny99PzRjSULYmxNc8gzcYRS66FL1hVRjSG8bk +// program: waNTLJXETasWVTP1qj84Zs6h7XY8qvzqmKd1QWqxyLB +// ata: G8P8sNvyZeSurzntNEBKUdYuhfZXDGyZLhQqNF3SY2sD +// xpct: G8P8sNvyZeSurzntNEBKUdYuhfZXDGyZLhQqNF3SY2sD +// bump: 255 +// rPda: F59qKVTV3cQLpc6PBE9fMDDRtbEx4LHQXbrS6ERF3NLs +// xpct: F59qKVTV3cQLpc6PBE9fMDDRtbEx4LHQXbrS6ERF3NLs +// bump: 255 +// ================================================================================ +// tx: 4zKUWGufk9WZpGpNxVSU9QFTo44QKAQsM6Qf5YEBRg4fNZqJc1eckQUUjue3LXA8WAAAEECQth8KKrkHTMsHcFQX +// program: waNTLJXETasWVTP1qj84Zs6h7XY8qvzqmKd1QWqxyLB +// ata: 27VpCTrNdKAcsWE72gxxBPBFXAGcAMLgbPaLLyQXfzHk +// xpct: 27VpCTrNdKAcsWE72gxxBPBFXAGcAMLgbPaLLyQXfzHk +// bump: 255 +// rPda: 2iDPhgaeiY6XCiHqMJUwhotd1F14bWV61ub6MuHyupCq +// xpct: 2iDPhgaeiY6XCiHqMJUwhotd1F14bWV61ub6MuHyupCq +// bump: 255 +// ================================================================================ +// tx: 2W39xBYrMkuPYfBtuYizp9FmWzWQduwhF7xn8nfgtD534z5bmkcX8YyyGRzyehg1uiaDfgJ5o3YnL4k7yNjHKVbS +// program: waNTLJXETasWVTP1qj84Zs6h7XY8qvzqmKd1QWqxyLB +// ata: 27VpCTrNdKAcsWE72gxxBPBFXAGcAMLgbPaLLyQXfzHk +// xpct: 27VpCTrNdKAcsWE72gxxBPBFXAGcAMLgbPaLLyQXfzHk +// bump: 255 +// rPda: 6PLAcgp3vin44ov4JTcpbUcD512UpN42wFDKHV8yzAfG +// xpct: 6PLAcgp3vin44ov4JTcpbUcD512UpN42wFDKHV8yzAfG +// bump: 255 +// ================================================================================ +// tx: 58e2fgsMAtwxNvv3wVRWbJuJdnwFx2thXxyEdtF5ZgeHq5g5FMD5m5fCbbhjEV4BpZD8kkt3wy1Nj1FuTAsyJehP +// program: waNTLJXETasWVTP1qj84Zs6h7XY8qvzqmKd1QWqxyLB +// ata: G8P8sNvyZeSurzntNEBKUdYuhfZXDGyZLhQqNF3SY2sD +// xpct: G8P8sNvyZeSurzntNEBKUdYuhfZXDGyZLhQqNF3SY2sD +// bump: 255 +// rPda: AfMmHhKn5WNyD4FhpswpHYMS1a4w9wZGP435GmdCNSjU +// xpct: AfMmHhKn5WNyD4FhpswpHYMS1a4w9wZGP435GmdCNSjU +// bump: 255 +// ================================================================================ +// tx: 3be6wQGM8FdDLMZm63r9YSMeXTZsAskrKvLKopDDCX8EHmCnjc9GGM28ArJRFRcs6uov7i3nSeKod4HsjtQ6swUS +// program: waNTLJXETasWVTP1qj84Zs6h7XY8qvzqmKd1QWqxyLB +// ata: G8P8sNvyZeSurzntNEBKUdYuhfZXDGyZLhQqNF3SY2sD +// xpct: G8P8sNvyZeSurzntNEBKUdYuhfZXDGyZLhQqNF3SY2sD +// bump: 255 +// rPda: 3Rz3KUin6XQ7L7oa8eG7mHnb2jaKTcbzWcyQz63GLtE5 +// xpct: 3Rz3KUin6XQ7L7oa8eG7mHnb2jaKTcbzWcyQz63GLtE5 +// bump: 253 +// ================================================================================ +// tx: 258c3CH8aHktZUUCtJHR8QNqEv5L1QaJB39YPs64dpt6ByeH84mB4xWw9tMEkJD6dcnys4iUuasnJfhpMED7Ge6z +// program: waNTLJXETasWVTP1qj84Zs6h7XY8qvzqmKd1QWqxyLB +// ata: 8zfuxc7A4qw6UBYTU8nnmymfAPzxyQPiMNcTfea8oS3 +// xpct: 8zfuxc7A4qw6UBYTU8nnmymfAPzxyQPiMNcTfea8oS3 +// bump: 255 +// rPda: G2ETsQseMyKRr4AHqC9CjVgHMhQmNjKs5TazY9gm4G7q +// xpct: G2ETsQseMyKRr4AHqC9CjVgHMhQmNjKs5TazY9gm4G7q +// bump: 255 +// ================================================================================ +// tx: 23HfzzuQBjSUDkLtM1VXeji3oT7ymDm6i8psudVuyxhkgedKEiVzqrpzsGT68ut5d9Qn2EdHNvT5aoaXQoQwRaDm +// program: waNTLJXETasWVTP1qj84Zs6h7XY8qvzqmKd1QWqxyLB +// ata: 8zfuxc7A4qw6UBYTU8nnmymfAPzxyQPiMNcTfea8oS3 +// xpct: 8zfuxc7A4qw6UBYTU8nnmymfAPzxyQPiMNcTfea8oS3 +// bump: 255 +// rPda: 3vT15aYxTQrmNtkQjShQBjNrNvVe8Ya6mypz6gem1QB9 +// xpct: 3vT15aYxTQrmNtkQjShQBjNrNvVe8Ya6mypz6gem1QB9 +// bump: 254 +// ================================================================================ +// tx: 5R1GrqETt7Cr5ebNhzAVX9SgvmToo8ZoL7t3n2nZUoCDnMFC7yRsp7sjqF9UVX6zug8fKS2PADZaTMFKSt2Ltawf +// program: waNTLJXETasWVTP1qj84Zs6h7XY8qvzqmKd1QWqxyLB +// ata: 8zfuxc7A4qw6UBYTU8nnmymfAPzxyQPiMNcTfea8oS3 +// xpct: 8zfuxc7A4qw6UBYTU8nnmymfAPzxyQPiMNcTfea8oS3 +// bump: 255 +// rPda: 6NpXeEjWCPD447ii9x2qFSv2Mhmq19xmYKqTqXtFx5sJ +// xpct: 6NpXeEjWCPD447ii9x2qFSv2Mhmq19xmYKqTqXtFx5sJ +// bump: 254 +// ================================================================================ +// tx: 5YjAyoDd8m8bmc7zD17imJWYRc4dg2HeyVWSL48i3647moJfontGmJwU7snpDTc4MqiqQx6AdMEW7rGeUQfzgW6e +// program: WA6TpiY1gcAxRAjz5rQeVeZzgHtJKSnRZsJoocFCEGU +// ata: 5UxD8NmcV9oLLUuKDqU15npkzuCPfbcXS4nWQGAbg7VG +// xpct: 5UxD8NmcV9oLLUuKDqU15npkzuCPfbcXS4nWQGAbg7VG +// bump: 255 +// rPda: CJzucTLaguyM3m6RWiCQYgYUt8XXEAvQeCGRzQK5LPCa +// xpct: CJzucTLaguyM3m6RWiCQYgYUt8XXEAvQeCGRzQK5LPCa +// bump: 255 +// ================================================================================ +// tx: hPruXEKJXFiwDNuLKqQuHt1BsygbdZHST4LXh9E52Bv2MusCzmC3S3ZAFvANjfjKkXBV7fedP3iMeDUpp8N5K52 +// program: WA6TpiY1gcAxRAjz5rQeVeZzgHtJKSnRZsJoocFCEGU +// ata: FXfJuWZryWAK2WTBGoqjuYSGqHAKbb4vfuRFD8UctCaZ +// xpct: FXfJuWZryWAK2WTBGoqjuYSGqHAKbb4vfuRFD8UctCaZ +// bump: 255 +// rPda: CRLwFwFpWcACmKCKQfJx98WH16iynjq51DwxadXkczAe +// xpct: CRLwFwFpWcACmKCKQfJx98WH16iynjq51DwxadXkczAe +// bump: 253 +// ================================================================================ +// tx: ouVLq5CMmrU76jghoEYFGjSivzf6noiVLqegUfjYEurgb9rRdnqqjzNcVXQUyWXttuuhoW9pV6yFVFBkjcNUMpr +// program: WA6TpiY1gcAxRAjz5rQeVeZzgHtJKSnRZsJoocFCEGU +// ata: EWfpdfTnnAdSKifqQprmCrG1VmoTYi9aDZkaW6JsxBWZ +// xpct: EWfpdfTnnAdSKifqQprmCrG1VmoTYi9aDZkaW6JsxBWZ +// bump: 255 +// rPda: A9TieXKjC7rbVHwHEf8hLwx73vPTR1Wo5oyQnD74vxb +// xpct: A9TieXKjC7rbVHwHEf8hLwx73vPTR1Wo5oyQnD74vxb +// bump: 255 +// ================================================================================ +// tx: 3pfztkbaUsHgpdNqwoAdAHksbs86y3odDn3tmyWjNRk5nyuHESCrYWddmqursKZStb94FQ7DrUg4wfgi1tuUMPgC +// program: WA6TpiY1gcAxRAjz5rQeVeZzgHtJKSnRZsJoocFCEGU +// ata: 9aUgQeZ3ZABcyBPRodU7Z3pSUZva1xPVviavTLLBG4T5 +// xpct: 9aUgQeZ3ZABcyBPRodU7Z3pSUZva1xPVviavTLLBG4T5 +// bump: 253 +// rPda: BsSvBXZjhYtBdtrLoy7JQayrTJGgaN6adXqwGdTRSQV9 +// xpct: BsSvBXZjhYtBdtrLoy7JQayrTJGgaN6adXqwGdTRSQV9 +// bump: 255 +// ================================================================================ +// tx: 3KoMAff3MuuoMRP2jhZCaCvBRfKHumaWG8Mmc1xbpQQYHwDkF28PphiWxS3tc5wTnwP1nT67LvNGYd6UdJeRbFXH +// program: WA6TpiY1gcAxRAjz5rQeVeZzgHtJKSnRZsJoocFCEGU +// ata: Ho62P3iPQ5W5et98dcMqGA8YwEqhqAFqfaiHGZL62Lha +// xpct: Ho62P3iPQ5W5et98dcMqGA8YwEqhqAFqfaiHGZL62Lha +// bump: 250 +// rPda: BaaKy8BM6zWBZr2NjinqGdPEjEuw8XyqUUVTWcmANW8u +// xpct: BaaKy8BM6zWBZr2NjinqGdPEjEuw8XyqUUVTWcmANW8u +// bump: 254 +// ================================================================================ +// tx: 4zG76KQU3QZdpZEvfHQwfSwtN45LhM3ipPqxd58BTmvBdVxAGSMBs5QwL7dTHmBrksn9wp7z28GPMKhKBTf3skfp +// program: WA6TpiY1gcAxRAjz5rQeVeZzgHtJKSnRZsJoocFCEGU +// ata: CWR8XKuSXHjMsyB9TBTMov7DboNYAMVpXbEVEHd5at67 +// xpct: CWR8XKuSXHjMsyB9TBTMov7DboNYAMVpXbEVEHd5at67 +// bump: 255 +// rPda: 9pq3NZ88s4y4JYPg59QRPpt82KxJhefCsLvZGYzCdyk5 +// xpct: 9pq3NZ88s4y4JYPg59QRPpt82KxJhefCsLvZGYzCdyk5 +// bump: 252 +// ================================================================================ +// tx: D1G125KsundqAvP9yGvbh5mr2tkYFik3o41kAQJTkQmz9GtVFKC6HK4Qd22sA7RRA3uWVGvRkr4PRZXUHnitMEZ +// program: WA6TpiY1gcAxRAjz5rQeVeZzgHtJKSnRZsJoocFCEGU +// ata: 5RLGgSF8azFHcKUaJbF4kKjqEtbviW2hbrmvhbL1nvfm +// xpct: 5RLGgSF8azFHcKUaJbF4kKjqEtbviW2hbrmvhbL1nvfm +// bump: 254 +// rPda: 5e8CC6qhMfYnRTLM7Ay4bKNcajaJhfjCFPhng5SZvPrT +// xpct: 5e8CC6qhMfYnRTLM7Ay4bKNcajaJhfjCFPhng5SZvPrT +// bump: 254 +// ================================================================================ +// tx: 3C4UNJLx71GSRCiJQ5b4LyW2DJrmvXsaNH7tidWdwZYrLQ2z7yufzTY8ssfV9asDzyzgpe4XkEicLqdL9pLyGPwx +// program: WA6TpiY1gcAxRAjz5rQeVeZzgHtJKSnRZsJoocFCEGU +// ata: CWR8XKuSXHjMsyB9TBTMov7DboNYAMVpXbEVEHd5at67 +// xpct: CWR8XKuSXHjMsyB9TBTMov7DboNYAMVpXbEVEHd5at67 +// bump: 255 +// rPda: E8KBxNHwo33zBHozUH9nxKWxCbd5bsDrMyz4p7UzPuwk +// xpct: E8KBxNHwo33zBHozUH9nxKWxCbd5bsDrMyz4p7UzPuwk +// bump: 250 +// ================================================================================ +// tx: 4uWbYwSZ5g3mBC2doAQVQJ9foRuBgXUf9sa1SteLdaU5zWB9WhvBmpPXgji2u8RBKfa3xLhPJmJLEdxx6YabL4Gw +// program: WA6TpiY1gcAxRAjz5rQeVeZzgHtJKSnRZsJoocFCEGU +// ata: 9aUgQeZ3ZABcyBPRodU7Z3pSUZva1xPVviavTLLBG4T5 +// xpct: 9aUgQeZ3ZABcyBPRodU7Z3pSUZva1xPVviavTLLBG4T5 +// bump: 253 +// rPda: 9VqJfhmY16uWUF19g68kvVLCmje8KhR8qnxQhcG7ysnF +// xpct: 9VqJfhmY16uWUF19g68kvVLCmje8KhR8qnxQhcG7ysnF +// bump: 254 +// ================================================================================ +// tx: 34vrzPudC4kZ4rsPSjjZG9pZRxxgeeV9KmSbbufMuwTXowoFcS7QuEtMDQwMNF4cygxRnB8uCGpvKBwF8ELpgcin +// program: WA6TpiY1gcAxRAjz5rQeVeZzgHtJKSnRZsJoocFCEGU +// ata: Ho62P3iPQ5W5et98dcMqGA8YwEqhqAFqfaiHGZL62Lha +// xpct: Ho62P3iPQ5W5et98dcMqGA8YwEqhqAFqfaiHGZL62Lha +// bump: 250 +// rPda: BeQ4xQAYV8wVNw6Mz17YLkJS5KPC7zMn6BJAW5yhDRFi +// xpct: BeQ4xQAYV8wVNw6Mz17YLkJS5KPC7zMn6BJAW5yhDRFi +// bump: 253 +// ================================================================================ +// tx: 5UURwBtJW8G4dQQh6qh6B4WmNP8NsiiCDVYuz4ydy5pyfqbBp3SWCXbAzZhVWygVnZsju5n4ZyT8BucebRz5UaUs +// program: WA6TpiY1gcAxRAjz5rQeVeZzgHtJKSnRZsJoocFCEGU +// ata: 5tFV7xjFWwSY4sJnPP2eMwV8rPRod3qSNXixCRdQoC3G +// xpct: 5tFV7xjFWwSY4sJnPP2eMwV8rPRod3qSNXixCRdQoC3G +// bump: 255 +// rPda: 8JUDRRrpmZejSbUn56yZjj6yBkmt2Aadb9EsjdYBx42f +// xpct: 8JUDRRrpmZejSbUn56yZjj6yBkmt2Aadb9EsjdYBx42f +// bump: 255 +// ================================================================================ +// tx: 5KkvmT5PrGv2xUmNyw1te6rJtjMQdNHEA8dydEsY2ECD9yubGoyLgUe1tEb8f7wfzgMveNbsPfyPKpbvti44bHMa +// program: WA6TpiY1gcAxRAjz5rQeVeZzgHtJKSnRZsJoocFCEGU +// ata: HF216CXtEVVPUneQh8FS5ZD6nwn2fiNtoqpBQDgocpdM +// xpct: HF216CXtEVVPUneQh8FS5ZD6nwn2fiNtoqpBQDgocpdM +// bump: 253 +// rPda: 2hMFR5WrT7YAY7Ep4XqYHYbcE7CRMCusqzMFGhDjgghF +// xpct: 2hMFR5WrT7YAY7Ep4XqYHYbcE7CRMCusqzMFGhDjgghF +// bump: 251 +// ================================================================================ +// tx: 5zy8wHfF3GMdPu9kLvyTBg46TszMxuRAoeBrcfYjbuxpnKw1TdEqnRFak7H9AKy523J653PEcHXjF2AmdMgh6sQf +// program: WA6TpiY1gcAxRAjz5rQeVeZzgHtJKSnRZsJoocFCEGU +// ata: 9aUgQeZ3ZABcyBPRodU7Z3pSUZva1xPVviavTLLBG4T5 +// xpct: 9aUgQeZ3ZABcyBPRodU7Z3pSUZva1xPVviavTLLBG4T5 +// bump: 253 +// rPda: 52cs96YUEoThSCXoZnwHJzPDcPScXbn3JKFWTLNTwPYh +// xpct: 52cs96YUEoThSCXoZnwHJzPDcPScXbn3JKFWTLNTwPYh +// bump: 251 +// ================================================================================ +// tx: bGbB8ugagCavqPFBSvTCat9GCD8Kqz3J317dYW2STAmzPs9xMkXLgehUyr1PSutT3H5PoZZyyUayPTJHaS3eNUs +// program: WA6TpiY1gcAxRAjz5rQeVeZzgHtJKSnRZsJoocFCEGU +// ata: 9aUgQeZ3ZABcyBPRodU7Z3pSUZva1xPVviavTLLBG4T5 +// xpct: 9aUgQeZ3ZABcyBPRodU7Z3pSUZva1xPVviavTLLBG4T5 +// bump: 253 +// rPda: 3Y7y5txWMnxBmbaBLo7ViTwL26EDxxH15L2HcX9sxk2V +// xpct: 3Y7y5txWMnxBmbaBLo7ViTwL26EDxxH15L2HcX9sxk2V +// bump: 255 +// ================================================================================ +// tx: 3w5hkXCKY2uy4tATGu457An8uBrZ1hB85Vw2hcmULqgESBZdX81WqNCuFzVH7v2Wc7EmQz8PeyuguSFBReH918nR +// program: WA6TpiY1gcAxRAjz5rQeVeZzgHtJKSnRZsJoocFCEGU +// ata: Ho62P3iPQ5W5et98dcMqGA8YwEqhqAFqfaiHGZL62Lha +// xpct: Ho62P3iPQ5W5et98dcMqGA8YwEqhqAFqfaiHGZL62Lha +// bump: 250 +// rPda: DRLkkZhrG7LnzAXpsxNnVCE64S8SX4SJSgMBJHUJUYRQ +// xpct: DRLkkZhrG7LnzAXpsxNnVCE64S8SX4SJSgMBJHUJUYRQ +// bump: 254 +// ================================================================================ +// tx: 3tqaAQBYmvHS2Dri9q1Fcg5SPBTBvaqWxqcMKiGyuuE8DJJXBZfH8dpxv1FGz5SYJV6SKoU75M7VtNLBkteCQn15 +// program: WA6TpiY1gcAxRAjz5rQeVeZzgHtJKSnRZsJoocFCEGU +// ata: 9aUgQeZ3ZABcyBPRodU7Z3pSUZva1xPVviavTLLBG4T5 +// xpct: 9aUgQeZ3ZABcyBPRodU7Z3pSUZva1xPVviavTLLBG4T5 +// bump: 253 +// rPda: A7YceyRVvMu8UcyQG4zmavmVbvnR9xXugr6gC3teQhos +// xpct: A7YceyRVvMu8UcyQG4zmavmVbvnR9xXugr6gC3teQhos +// bump: 254 +// ================================================================================ +// tx: 4m5Lm9PcLY9r5RdYrFfpVdn9H9bxYSRnXrZxjoK4L3PL5j5WQfbm2fLNt8JRUVSQSCruT98eUdooTmbg4JAk7vxP +// program: WA6TpiY1gcAxRAjz5rQeVeZzgHtJKSnRZsJoocFCEGU +// ata: 9aUgQeZ3ZABcyBPRodU7Z3pSUZva1xPVviavTLLBG4T5 +// xpct: 9aUgQeZ3ZABcyBPRodU7Z3pSUZva1xPVviavTLLBG4T5 +// bump: 253 +// rPda: 32Uv9RSN56AL574gYx71hh8KFo9b5kAZjvwPpDUWd6ay +// xpct: 32Uv9RSN56AL574gYx71hh8KFo9b5kAZjvwPpDUWd6ay +// bump: 255 +// ================================================================================ +// tx: 4P65T1mw1YYgY53Xcyuu373MMoFCDzro8j2YWjMx6anY86XQ6F1qvrpZtLK5a1fAntyB7bBdfZ2NryAs8jBttn2J +// program: WA6TpiY1gcAxRAjz5rQeVeZzgHtJKSnRZsJoocFCEGU +// ata: 9aUgQeZ3ZABcyBPRodU7Z3pSUZva1xPVviavTLLBG4T5 +// xpct: 9aUgQeZ3ZABcyBPRodU7Z3pSUZva1xPVviavTLLBG4T5 +// bump: 253 +// rPda: 4kUMgybdWSimouGckVdSqrD1acGMBUhrufyxjmbWyjT7 +// xpct: 4kUMgybdWSimouGckVdSqrD1acGMBUhrufyxjmbWyjT7 +// bump: 254 +// ================================================================================ +// tx: wLcgmj3mhtrjjdinCJJgbYioiaiuNnrTWqTiKpDpC9x6AvSMn6KzTEWXB89VoPk7D5vCEcQvTwyWwkRCaqCHWgm +// program: WA6TpiY1gcAxRAjz5rQeVeZzgHtJKSnRZsJoocFCEGU +// ata: 9aUgQeZ3ZABcyBPRodU7Z3pSUZva1xPVviavTLLBG4T5 +// xpct: 9aUgQeZ3ZABcyBPRodU7Z3pSUZva1xPVviavTLLBG4T5 +// bump: 253 +// rPda: s6z6UwVvQQNLV8fji2vGovfm7WkkKENQUKxRSTDBjDZ +// xpct: s6z6UwVvQQNLV8fji2vGovfm7WkkKENQUKxRSTDBjDZ +// bump: 255 +// ================================================================================ +// tx: 5xRyfymFQBL6hKgACFfsxkhEy9Jbxmja236P7VgwKHgVgNAZqmw3yLwST4CiADWKTkA75iuLc8YJN3Tsm8XfkMRm +// program: WA6TpiY1gcAxRAjz5rQeVeZzgHtJKSnRZsJoocFCEGU +// ata: 9aUgQeZ3ZABcyBPRodU7Z3pSUZva1xPVviavTLLBG4T5 +// xpct: 9aUgQeZ3ZABcyBPRodU7Z3pSUZva1xPVviavTLLBG4T5 +// bump: 253 +// rPda: AbYxsUnMoA7x2boxAkjW3ZAVBUGmTDbTUuG9JgB9PUV1 +// xpct: AbYxsUnMoA7x2boxAkjW3ZAVBUGmTDbTUuG9JgB9PUV1 +// bump: 254 +// ================================================================================ +// tx: 3JQapHPhJAvfEq2UV9ywnmaSLPDrzQtNrJPudqSmXBpUmf6N5svAQWWKTbKVHYNp4ZoEAnY1hr3ibfvB2WpBkABD +// program: WAPGu4AoTGCYbp1iXnZTpBn89VkJNJX3jY7uPuUZAv7 +// ata: 7zxEbLsj5VbGb4qvUd5Uo9JjJww97YxP58ggP5yhaaZg +// xpct: 7zxEbLsj5VbGb4qvUd5Uo9JjJww97YxP58ggP5yhaaZg +// bump: 255 +// rPda: DB9LXuNRUvoQmnRLVkZaN23bDpSK63vrpPREAixTW5Ku +// xpct: DB9LXuNRUvoQmnRLVkZaN23bDpSK63vrpPREAixTW5Ku +// bump: 255 +// ================================================================================ +// tx: 5i7xkSQjnar5vNTKddSdL6aVxuYD44Q1etYynfJuV2VFsQqcTGpfPeeo6qJqkWfDSGfP6fX9XWhaN6p8wTBiAfcF +// program: WAPGu4AoTGCYbp1iXnZTpBn89VkJNJX3jY7uPuUZAv7 +// ata: 5h1d1xqDgYkqYzqAygwPcABGPb4C98itCEKokq5w2hsa +// xpct: 5h1d1xqDgYkqYzqAygwPcABGPb4C98itCEKokq5w2hsa +// bump: 255 +// rPda: AnTKt5uMGv3xQY2N5v7XxjhvLH7WpCW4LuAQCZtEvKjn +// xpct: AnTKt5uMGv3xQY2N5v7XxjhvLH7WpCW4LuAQCZtEvKjn +// bump: 252 +// ================================================================================ +// tx: 2LCat1JPttHvrzTUUXwLz4YGx5gWszQpoHcz9cQuXpuFX1b6pFdfx3CV9yyexrwv4gZh5YnSUJiaGyoFEU5TaQnN +// program: WAPGu4AoTGCYbp1iXnZTpBn89VkJNJX3jY7uPuUZAv7 +// ata: 7yqeeFsxkA5p1jUWcfb22azXUYPajmiA8cqZAEH4Ykkt +// xpct: 7yqeeFsxkA5p1jUWcfb22azXUYPajmiA8cqZAEH4Ykkt +// bump: 255 +// rPda: A7PmVkGkN5f5NNkUCcam2v62k8aaBzqssPWB5Zq2hBNo +// xpct: A7PmVkGkN5f5NNkUCcam2v62k8aaBzqssPWB5Zq2hBNo +// bump: 252 +// ================================================================================ + +//############################################################################# + +//code: + +import { PublicKey } from "@solana/web3.js"; +import { TOKEN_PROGRAM_ID, ASSOCIATED_TOKEN_PROGRAM_ID } from "@solana/spl-token" +import { encoding } from "@wormhole-foundation/sdk-base"; +import { keccak256 } from "@wormhole-foundation/sdk-definitions"; + +const getAtaAndBump = (owner: PublicKey, mint: PublicKey) => + PublicKey.findProgramAddressSync( + [ + owner.toBytes(), + TOKEN_PROGRAM_ID.toBytes(), + mint.toBytes(), + ], + ASSOCIATED_TOKEN_PROGRAM_ID + ); + +function printTxInfo( + grantProgramId: string, + mint: string, + tx: string, + ecosystem: number, + claimant: string, + expectedAta: string, + identity: string, + expectedReceipt: string +) { + console.log("tx:", tx); + console.log("program:", grantProgramId); + const [ata, ataBump] = getAtaAndBump(new PublicKey(claimant), new PublicKey(mint)); + console.log(" ata:", ata.toBase58()); + console.log("xpct:", expectedAta); + console.log("bump:", ataBump); + const leaf = "00" + "0" + ecosystem + identity + amount; + //console.log("leaf:", leaf) + const leafHash = keccak256(encoding.hex.decode(leaf)).slice(0, 20); + //console.log("hash:", encoding.hex.encode(leafHash)); + const [rPda, bump] = PublicKey.findProgramAddressSync( + [encoding.bytes.encode("receipt"), leafHash], + new PublicKey(grantProgramId) + ); + console.log("rPda:", rPda.toBase58()); + console.log("xpct:", expectedReceipt) + console.log("bump:", bump); +} + +//all txs have the same amount +const amount = "00e1f50500000000"; +//tools used to calc identities: +// sha256: https://emn178.github.io/online-tools/sha256.html +// sha3-256: https://emn178.github.io/online-tools/sha3_256.html +// ripemd160: https://emn178.github.io/online-tools/ripemd_160.html +// bech32: https://slowli.github.io/bech32-buffer/ +// blake2b: https://hashing.tools/blake/blake2b +// ascii2hex: https://www.rapidtables.com/convert/number/ascii-to-hex.html +const txData = [ + [ + "waNTLJXETasWVTP1qj84Zs6h7XY8qvzqmKd1QWqxyLB", + "8UfkZKLgkQXLmnTQCpkxdmmAs8bGfjn9iiWrEKVvsrFx", + [ + [ + "3PYnssaWxjCXRQYBZHXsowJSCEaYHd1McH2GT3v5Jk7GaxbMCNRC54FF5qnpoPt1dkik8GgzJEhyJG4RQcd5mSCi", + 0, //Discord + "7q8qKpas5USmZwoxWQd36QYjPDgC7SK8cfHAacb5L2VH", + "9DSf7q55crkvaCMKFNh6MkFy3K9ab2TAxCPxpkoHLu2m", + "1300000031303034343734323937333336373337393233", + "MuNQAviUg6ZFvWp9Ft5PHchiMHeWE99mqw5zyMQzm7x" + ], [ + "U2zuQn7sDkNz6NZMVrEqTjPqNHG4zWDLqHh8CVuhqGutCr8WZ5eqqmLhTjZmhkMCZNLxRjJ3RhR7fTUGkJAHd1E", + 0, //Discord + "BswhzNvtNquLt5w2GbXqYvDLd95a2VnMxD4q6zhyaQFD", + "3xwGBStS3QX5hGmxweKaZgPK7QTLcEJG7YV2XYKGB3jr", + "12000000343736373430373536343035373437373133", + "BoSoN8zrkjva2BqaPnoshkhLB1AxLz6oe76x1zMo87X5" + ], [ + "573ui4vx3Avd8WpANYeUYwNdhcyj4FfY5P6QYRKPfrWNsqTaYRjzh2259J3tAQA6g1EctTfCsT5vzLtQNQhCQko4", + 0, //Discord + "BTwXQZS3EzfxBkv2A54estmn9YbmcpmRWeFP4f3avLi4", + "qYSg66vZNiAEy8k2SXBgxjnwiR8MR8N6vSP6YJWg73n", + "12000000343635343135383237383930363334373533", + "G9cpkCBzMcp7h3dZN6wLT8mRX8iDB4m8gd4T3cumHLdw" + ], [ + "4ERr2CdGa4ZmmVv4He8wmQXRzxjeGqpvEWFfSFoPbB7ohxGozJBc2vs9hZrKwWDXSQstint9LWc7poLYUuEt6GUu", + 0, //Discord + "89u5A3WLQh6xqPnvNEDDd8FBtRcvjAbZ28bbygeMoZDz", + "27VpCTrNdKAcsWE72gxxBPBFXAGcAMLgbPaLLyQXfzHk", + "12000000343237363236373331363137313234333536", + "2FSYp5oRWcUtCjBrij49YL7BZXiugknE2pEdFJAgdWdr" + ], [ + "3w4NM3fqxn2AfDa6c3P2kHsa2WzqQzbN3zH1wAVh63VYiFuHmKWDDk94Scgbjx6YGRJANVXStytXa9DjYRKVWpwZ", + 2, //evm + "Bc6acCmU9WhwDEFG4t37iJHUosMVrQ3sJS4UqnBcEgmf", + "8zfuxc7A4qw6UBYTU8nnmymfAPzxyQPiMNcTfea8oS3", + "0826d11726864b93993d333b784f42484e055c1e", + "3yqmGaXpcGfavuL4SVwrffAuH48kL9oS2bLAN86TQ58Q", + ], [ + "2ZoVWD1ToZVswUtkRDkPRAHzZGVGwgH66tfxLbswrJxnCcZjhYwsFCaZEsV2BWPBueh9TKB1UAFmkm82DKPKRoo9", + 2, //evm + "FyWzHEvV3xJKB1LADjQmQQR7A6kv4Dhb261q3rkcDHJq", + "G8P8sNvyZeSurzntNEBKUdYuhfZXDGyZLhQqNF3SY2sD", + "f2debd6e66aec4b2021e1d231651ab696ecc2afa", + "4yhfTbWg7cyucVRPzftSoyhqetv9urjpJwgFBNrpvdRG", + ], [ + "jucMMWFaafZD3F8MRutRJVkoqMfgzW53VHxRf5Jh79aBDGX7uwEDW1R4uDkSy3aVvRzoigSSRbatYDw5RijTDqp", + 2, //evm + "FyWzHEvV3xJKB1LADjQmQQR7A6kv4Dhb261q3rkcDHJq", + "G8P8sNvyZeSurzntNEBKUdYuhfZXDGyZLhQqNF3SY2sD", + "a70004dd7c887fb600b99fe6012aa11ce144f187", + "7yXVeoRk7C5HV6vMWrbtRr73kREviv79YPUAcSKQC3Bc", + ], [ + "3vyc2UPgCiPT67mHTDjpiKmHPLQukGtp44GbmBpVVKV85nZyTba2xKtN9ZKRJdxVTuLSJuHwA1u1kwKWBRJsiFXT", + 2, //evm + "Bc6acCmU9WhwDEFG4t37iJHUosMVrQ3sJS4UqnBcEgmf", + "8zfuxc7A4qw6UBYTU8nnmymfAPzxyQPiMNcTfea8oS3", + "4b5466e2a70c7292dcde9676854a3a7b3ac3df87", + "9jVoQgUwrKAeQ864jKd2onJ87c6WB34GcZ2D6PaQo28f", + ], [ + "4BfPPiHHm7Neq2utLb4zqKqAXWnz6nzAi8quRAwpRaaNXrcvQo3Ny99PzRjSULYmxNc8gzcYRS66FL1hVRjSG8bk", + 2, //evm + "FyWzHEvV3xJKB1LADjQmQQR7A6kv4Dhb261q3rkcDHJq", + "G8P8sNvyZeSurzntNEBKUdYuhfZXDGyZLhQqNF3SY2sD", + "59de65b85f69ddb0ef226d75e0a4129088a254d6", + "F59qKVTV3cQLpc6PBE9fMDDRtbEx4LHQXbrS6ERF3NLs", + ], [ + "4zKUWGufk9WZpGpNxVSU9QFTo44QKAQsM6Qf5YEBRg4fNZqJc1eckQUUjue3LXA8WAAAEECQth8KKrkHTMsHcFQX", + 2, //evm + "89u5A3WLQh6xqPnvNEDDd8FBtRcvjAbZ28bbygeMoZDz", + "27VpCTrNdKAcsWE72gxxBPBFXAGcAMLgbPaLLyQXfzHk", + "5f4ca243e844f082403c9bdfa6f7d1b3b2666d11", + "2iDPhgaeiY6XCiHqMJUwhotd1F14bWV61ub6MuHyupCq", + ], [ + "2W39xBYrMkuPYfBtuYizp9FmWzWQduwhF7xn8nfgtD534z5bmkcX8YyyGRzyehg1uiaDfgJ5o3YnL4k7yNjHKVbS", + 2, //evm + "89u5A3WLQh6xqPnvNEDDd8FBtRcvjAbZ28bbygeMoZDz", + "27VpCTrNdKAcsWE72gxxBPBFXAGcAMLgbPaLLyQXfzHk", + "c1ce054e9450d167717b5196f5d7351b1d104b11", + "6PLAcgp3vin44ov4JTcpbUcD512UpN42wFDKHV8yzAfG", + ], [ + "58e2fgsMAtwxNvv3wVRWbJuJdnwFx2thXxyEdtF5ZgeHq5g5FMD5m5fCbbhjEV4BpZD8kkt3wy1Nj1FuTAsyJehP", + 4, //aptos + "FyWzHEvV3xJKB1LADjQmQQR7A6kv4Dhb261q3rkcDHJq", + "G8P8sNvyZeSurzntNEBKUdYuhfZXDGyZLhQqNF3SY2sD", + //pubkey: 9dde8223960fea22b142eca661c3c172351149067a4f2bf263e4aac9781296c5 + 00 + //sha3-256: 0bf0a9442ef76768ece6f35a5f3e99e29f870436b5a75935f013da9577f2e02f + "0bf0a9442ef76768ece6f35a5f3e99e29f870436b5a75935f013da9577f2e02f", + "AfMmHhKn5WNyD4FhpswpHYMS1a4w9wZGP435GmdCNSjU", + ], [ + "3be6wQGM8FdDLMZm63r9YSMeXTZsAskrKvLKopDDCX8EHmCnjc9GGM28ArJRFRcs6uov7i3nSeKod4HsjtQ6swUS", + 5, //cosmwasm + "FyWzHEvV3xJKB1LADjQmQQR7A6kv4Dhb261q3rkcDHJq", + "G8P8sNvyZeSurzntNEBKUdYuhfZXDGyZLhQqNF3SY2sD", + //identity cert: + // "osmo": 040000006f736d6f + // signature: 0182223418ecc93841cdc637b8ac031c7c17ef6a6dba5f266bb84a7f3041900551c192b10ccd70e47b117f1af7546acd6ce48947b15ee32f4b65640415648b15 + // recovery id: 01 + // pubkey: 044b272d50d4c1dffaafe8d007ab3257577e1c9d632b0dc3a1d1b9e4b5a6601b796cfe9d2e7e82a1c8bd05e061af87b867cbd1d774accf55e59abc5040683159ef + //to identity: + // compressed: 034b272d50d4c1dffaafe8d007ab3257577e1c9d632b0dc3a1d1b9e4b5a6601b79 + // sha256: 45fdc8b6b25ff3123c4fa5b9798b1ecc6a5b080668b249febcbb986abc779008 + // ripemd160: 98d2155452c1c5f12a928d692e6e9b86c1b4a378 + // bech32: osmo1nrfp24zjc8zlz25j345jum5msmqmfgmcywvq2w + // hex: 6F736D6F316E72667032347A6A63387A6C7A32356A3334356A756D356D736D716D66676D63797776713277 + "2b0000006F736D6F316E72667032347A6A63387A6C7A32356A3334356A756D356D736D716D66676D63797776713277", + "3Rz3KUin6XQ7L7oa8eG7mHnb2jaKTcbzWcyQz63GLtE5", + ], [ + "258c3CH8aHktZUUCtJHR8QNqEv5L1QaJB39YPs64dpt6ByeH84mB4xWw9tMEkJD6dcnys4iUuasnJfhpMED7Ge6z", + 5, //cosmwasm + "Bc6acCmU9WhwDEFG4t37iJHUosMVrQ3sJS4UqnBcEgmf", + "8zfuxc7A4qw6UBYTU8nnmymfAPzxyQPiMNcTfea8oS3", + //identity cert: + // "terra": 050000007465727261 + // pubkey: 0455389f44092ed286630a6e36df38f6632cd869222515aedc0ff2a5820e210514d8f686a40fb1f3efe7bee02f878646ddcbcb1b3712c179fce78341bf1d434479 + //to identity: + // compressed: 0355389f44092ed286630a6e36df38f6632cd869222515aedc0ff2a5820e210514 + // sha256: 0c6dd3f02602264d5cc70aa787e3e504e53d158da8d1ad241e86ab2853b46481 + // ripemd160: dd6ba0eeddf462f72325831f37e4f089e179dcc9 + // bech32: terra1m446pmka7330wge9sv0n0e8s38shnhxfu5882u + // hex: 7465727261316D343436706D6B6137333330776765397376306E30653873333873686E687866753538383275 + "2c0000007465727261316D343436706D6B6137333330776765397376306E30653873333873686E687866753538383275", + "G2ETsQseMyKRr4AHqC9CjVgHMhQmNjKs5TazY9gm4G7q", + ], [ + "23HfzzuQBjSUDkLtM1VXeji3oT7ymDm6i8psudVuyxhkgedKEiVzqrpzsGT68ut5d9Qn2EdHNvT5aoaXQoQwRaDm", + 5, //cosmwasm + "Bc6acCmU9WhwDEFG4t37iJHUosMVrQ3sJS4UqnBcEgmf", + "8zfuxc7A4qw6UBYTU8nnmymfAPzxyQPiMNcTfea8oS3", + //identity cert: + // osmo + // pubkey: 04a052515bdc4d98d3d147ad811351e18907fb3c8e38889b9946c168c41c56ef5f985bad6c91f43f92af8cd5ee3a3a5c1fe8d65f612f7739dd78fcc89927fd52b4 + //to identity: + // compressed: 02a052515bdc4d98d3d147ad811351e18907fb3c8e38889b9946c168c41c56ef5f + // sha256: 6bec30eaba0b6c94a3e998c611722b7918b81c1c091f2e73b4ac2f21ff975a85 + // ripemd160: 40a2e5b4e94faf77b300120057a396cd287ff16e + // bech32: osmo1gz3wtd8ff7hh0vcqzgq90guke558lutwaq22wn + // hex: 6F736D6F31677A33777464386666376868307663717A6771393067756B653535386C75747761713232776E + "2b0000006F736D6F31677A33777464386666376868307663717A6771393067756B653535386C75747761713232776E", + "3vT15aYxTQrmNtkQjShQBjNrNvVe8Ya6mypz6gem1QB9", + ], [ + "5R1GrqETt7Cr5ebNhzAVX9SgvmToo8ZoL7t3n2nZUoCDnMFC7yRsp7sjqF9UVX6zug8fKS2PADZaTMFKSt2Ltawf", + 6, //injective + "Bc6acCmU9WhwDEFG4t37iJHUosMVrQ3sJS4UqnBcEgmf", + "8zfuxc7A4qw6UBYTU8nnmymfAPzxyQPiMNcTfea8oS3", + //evm pubkey: 911797dd3f93a0ed059b6abe879dcd5717e80a12 + //bech32: inj1jyte0hfljwsw6pvmd2lg08wd2ut7szsjk8pvls + //asci: 696E6A316A7974653068666C6A7773773670766D64326C673038776432757437737A736A6B3870766C73 + "2a000000696E6A316A7974653068666C6A7773773670766D64326C673038776432757437737A736A6B3870766C73", + "6NpXeEjWCPD447ii9x2qFSv2Mhmq19xmYKqTqXtFx5sJ" + ] + ] + ], + [ + "WA6TpiY1gcAxRAjz5rQeVeZzgHtJKSnRZsJoocFCEGU", + "9wonvscTW35qT622Z9LvgFtrba3YZFTqb7dZK1iktoXT", + [ + [ + "5YjAyoDd8m8bmc7zD17imJWYRc4dg2HeyVWSL48i3647moJfontGmJwU7snpDTc4MqiqQx6AdMEW7rGeUQfzgW6e", + 2, //evm + "BTwXQZS3EzfxBkv2A54estmn9YbmcpmRWeFP4f3avLi4", + "5UxD8NmcV9oLLUuKDqU15npkzuCPfbcXS4nWQGAbg7VG", + "4b5466e2a70c7292dcde9676854a3a7b3ac3df87", + "CJzucTLaguyM3m6RWiCQYgYUt8XXEAvQeCGRzQK5LPCa" + ], [ + "hPruXEKJXFiwDNuLKqQuHt1BsygbdZHST4LXh9E52Bv2MusCzmC3S3ZAFvANjfjKkXBV7fedP3iMeDUpp8N5K52", + 2, //evm + "3uuEwaVXjsszp5GoLonhRYm3NZBZfGbJ6zDRAgnue9wW", + "FXfJuWZryWAK2WTBGoqjuYSGqHAKbb4vfuRFD8UctCaZ", + "97ea8287e32ab88683d3dc334c70abb266058d0e", + "CRLwFwFpWcACmKCKQfJx98WH16iynjq51DwxadXkczAe" + ], [ + "ouVLq5CMmrU76jghoEYFGjSivzf6noiVLqegUfjYEurgb9rRdnqqjzNcVXQUyWXttuuhoW9pV6yFVFBkjcNUMpr", + 2, //evm + "HxLmHhRAfo9PGojaD39Mbs8rVsydkj6WT1qYji8PuJ5j", + "EWfpdfTnnAdSKifqQprmCrG1VmoTYi9aDZkaW6JsxBWZ", + "d17d7390af3cc6f71c800bbe9a0bcdf44271ce0d", + "A9TieXKjC7rbVHwHEf8hLwx73vPTR1Wo5oyQnD74vxb" + ], [ + "3pfztkbaUsHgpdNqwoAdAHksbs86y3odDn3tmyWjNRk5nyuHESCrYWddmqursKZStb94FQ7DrUg4wfgi1tuUMPgC", + 2, //evm + "FyWzHEvV3xJKB1LADjQmQQR7A6kv4Dhb261q3rkcDHJq", + "9aUgQeZ3ZABcyBPRodU7Z3pSUZva1xPVviavTLLBG4T5", + "a70004dd7c887fb600b99fe6012aa11ce144f187", + "BsSvBXZjhYtBdtrLoy7JQayrTJGgaN6adXqwGdTRSQV9" + ], [ + "3KoMAff3MuuoMRP2jhZCaCvBRfKHumaWG8Mmc1xbpQQYHwDkF28PphiWxS3tc5wTnwP1nT67LvNGYd6UdJeRbFXH", + 2, //evm + "89u5A3WLQh6xqPnvNEDDd8FBtRcvjAbZ28bbygeMoZDz", + "Ho62P3iPQ5W5et98dcMqGA8YwEqhqAFqfaiHGZL62Lha", + "3399052c19d6d60daf364e31feb19e6cfd156fc2", + "BaaKy8BM6zWBZr2NjinqGdPEjEuw8XyqUUVTWcmANW8u" + ], [ + "4zG76KQU3QZdpZEvfHQwfSwtN45LhM3ipPqxd58BTmvBdVxAGSMBs5QwL7dTHmBrksn9wp7z28GPMKhKBTf3skfp", + 2, //evm + "573yfYSJp3AgufxdvgMCZ7agEmpoL8KTu2c17Wrx78YH", + "CWR8XKuSXHjMsyB9TBTMov7DboNYAMVpXbEVEHd5at67", + "33a08ad58b7475f2371a89c5d7ab106ada2ae350", + "9pq3NZ88s4y4JYPg59QRPpt82KxJhefCsLvZGYzCdyk5" + ], [ + "D1G125KsundqAvP9yGvbh5mr2tkYFik3o41kAQJTkQmz9GtVFKC6HK4Qd22sA7RRA3uWVGvRkr4PRZXUHnitMEZ", + 1, //solana + "BvwvH7fP6EqoduboWt9UcWFtoNviLinviWDD4oNGLA8", + "5RLGgSF8azFHcKUaJbF4kKjqEtbviW2hbrmvhbL1nvfm", + encoding.hex.encode(encoding.b58.decode("BvwvH7fP6EqoduboWt9UcWFtoNviLinviWDD4oNGLA8")), + "5e8CC6qhMfYnRTLM7Ay4bKNcajaJhfjCFPhng5SZvPrT" + ], [ + "3C4UNJLx71GSRCiJQ5b4LyW2DJrmvXsaNH7tidWdwZYrLQ2z7yufzTY8ssfV9asDzyzgpe4XkEicLqdL9pLyGPwx", + 1, //solana + "573yfYSJp3AgufxdvgMCZ7agEmpoL8KTu2c17Wrx78YH", + "CWR8XKuSXHjMsyB9TBTMov7DboNYAMVpXbEVEHd5at67", + encoding.hex.encode(encoding.b58.decode("573yfYSJp3AgufxdvgMCZ7agEmpoL8KTu2c17Wrx78YH")), + "E8KBxNHwo33zBHozUH9nxKWxCbd5bsDrMyz4p7UzPuwk" + ], [ + "4uWbYwSZ5g3mBC2doAQVQJ9foRuBgXUf9sa1SteLdaU5zWB9WhvBmpPXgji2u8RBKfa3xLhPJmJLEdxx6YabL4Gw", + 1, //solana + "FyWzHEvV3xJKB1LADjQmQQR7A6kv4Dhb261q3rkcDHJq", + "9aUgQeZ3ZABcyBPRodU7Z3pSUZva1xPVviavTLLBG4T5", + encoding.hex.encode(encoding.b58.decode("FyWzHEvV3xJKB1LADjQmQQR7A6kv4Dhb261q3rkcDHJq")), + "9VqJfhmY16uWUF19g68kvVLCmje8KhR8qnxQhcG7ysnF" + ], [ + "34vrzPudC4kZ4rsPSjjZG9pZRxxgeeV9KmSbbufMuwTXowoFcS7QuEtMDQwMNF4cygxRnB8uCGpvKBwF8ELpgcin", + 1, //solana + "89u5A3WLQh6xqPnvNEDDd8FBtRcvjAbZ28bbygeMoZDz", + "Ho62P3iPQ5W5et98dcMqGA8YwEqhqAFqfaiHGZL62Lha", + encoding.hex.encode(encoding.b58.decode("89u5A3WLQh6xqPnvNEDDd8FBtRcvjAbZ28bbygeMoZDz")), + "BeQ4xQAYV8wVNw6Mz17YLkJS5KPC7zMn6BJAW5yhDRFi" + ], [ + "5UURwBtJW8G4dQQh6qh6B4WmNP8NsiiCDVYuz4ydy5pyfqbBp3SWCXbAzZhVWygVnZsju5n4ZyT8BucebRz5UaUs", + 1, //solana + "4pJnUs7SY7rARFi3NjJwMvzGZnYypQ6r6JvSXs4Xoxgn", + "5tFV7xjFWwSY4sJnPP2eMwV8rPRod3qSNXixCRdQoC3G", + encoding.hex.encode(encoding.b58.decode("4pJnUs7SY7rARFi3NjJwMvzGZnYypQ6r6JvSXs4Xoxgn")), + "8JUDRRrpmZejSbUn56yZjj6yBkmt2Aadb9EsjdYBx42f" + ], [ + "5KkvmT5PrGv2xUmNyw1te6rJtjMQdNHEA8dydEsY2ECD9yubGoyLgUe1tEb8f7wfzgMveNbsPfyPKpbvti44bHMa", + 1, //solana + "3UyQice7qgUGkfjYDbGxCukU9dqXbTasK4RVeLxtVzQa", + "HF216CXtEVVPUneQh8FS5ZD6nwn2fiNtoqpBQDgocpdM", + encoding.hex.encode(encoding.b58.decode("3UyQice7qgUGkfjYDbGxCukU9dqXbTasK4RVeLxtVzQa")), + "2hMFR5WrT7YAY7Ep4XqYHYbcE7CRMCusqzMFGhDjgghF" + ], [ + "5zy8wHfF3GMdPu9kLvyTBg46TszMxuRAoeBrcfYjbuxpnKw1TdEqnRFak7H9AKy523J653PEcHXjF2AmdMgh6sQf", + 3, //sui + "FyWzHEvV3xJKB1LADjQmQQR7A6kv4Dhb261q3rkcDHJq", + "9aUgQeZ3ZABcyBPRodU7Z3pSUZva1xPVviavTLLBG4T5", + //pubkey: 00 + 46d33d6dff684ffe92be7e82435ec96e9f5941f35940e77779b6c41e13c42618 + //blake2b: de109835b2ae8d6cfb2fa5ab20706d70a2330c59f8f8d827b001db6cc521d269 + "de109835b2ae8d6cfb2fa5ab20706d70a2330c59f8f8d827b001db6cc521d269", + "52cs96YUEoThSCXoZnwHJzPDcPScXbn3JKFWTLNTwPYh" + ], [ + "bGbB8ugagCavqPFBSvTCat9GCD8Kqz3J317dYW2STAmzPs9xMkXLgehUyr1PSutT3H5PoZZyyUayPTJHaS3eNUs", + 4, //aptos + "FyWzHEvV3xJKB1LADjQmQQR7A6kv4Dhb261q3rkcDHJq", + "9aUgQeZ3ZABcyBPRodU7Z3pSUZva1xPVviavTLLBG4T5", + //pubkey: 9dde8223960fea22b142eca661c3c172351149067a4f2bf263e4aac9781296c5 + 00 + //sha3-256: 0bf0a9442ef76768ece6f35a5f3e99e29f870436b5a75935f013da9577f2e02f + "0bf0a9442ef76768ece6f35a5f3e99e29f870436b5a75935f013da9577f2e02f", + "3Y7y5txWMnxBmbaBLo7ViTwL26EDxxH15L2HcX9sxk2V" + ], [ + "3w5hkXCKY2uy4tATGu457An8uBrZ1hB85Vw2hcmULqgESBZdX81WqNCuFzVH7v2Wc7EmQz8PeyuguSFBReH918nR", + 4, //aptos + "89u5A3WLQh6xqPnvNEDDd8FBtRcvjAbZ28bbygeMoZDz", + "Ho62P3iPQ5W5et98dcMqGA8YwEqhqAFqfaiHGZL62Lha", + //pubkey: + 00 + //sha3-256: 1c963ea09f2511f42bbda25f731808dc1823ff6deb04f0fe8f9a9b9773b23328 + "1c963ea09f2511f42bbda25f731808dc1823ff6deb04f0fe8f9a9b9773b23328", + "DRLkkZhrG7LnzAXpsxNnVCE64S8SX4SJSgMBJHUJUYRQ" + ], [ + "3tqaAQBYmvHS2Dri9q1Fcg5SPBTBvaqWxqcMKiGyuuE8DJJXBZfH8dpxv1FGz5SYJV6SKoU75M7VtNLBkteCQn15", + 5, //cosmwasm + "FyWzHEvV3xJKB1LADjQmQQR7A6kv4Dhb261q3rkcDHJq", + "9aUgQeZ3ZABcyBPRodU7Z3pSUZva1xPVviavTLLBG4T5", + //identity cert: + // osmo + // pubkey: 0427b74377fc92cb6051842a22bae952392e80807cb6cd02616ef6eb34c6d468b222bb110586f218d3623bc5aac61590858ef5d228bfbd496b2091928d4800fda2 + //to identity: + // compressed: 0227b74377fc92cb6051842a22bae952392e80807cb6cd02616ef6eb34c6d468b2 + // sha256: 7376d9151bbf64f9ab9920269279c7ff716c02897072aea8452b3a386de804e6 + // ripemd160: e0148fd6ce0a7e4e729f8da056da0a37e939f517 + // bech32: osmo1uq2gl4kwpflyuu5l3ks9dks2xl5nnaghcfjw06 + // hex: 6F736D6F31757132676C346B7770666C797575356C336B7339646B7332786C356E6E61676863666A773036 + "2b0000006F736D6F31757132676C346B7770666C797575356C336B7339646B7332786C356E6E61676863666A773036", + "A7YceyRVvMu8UcyQG4zmavmVbvnR9xXugr6gC3teQhos" + ], [ + "4m5Lm9PcLY9r5RdYrFfpVdn9H9bxYSRnXrZxjoK4L3PL5j5WQfbm2fLNt8JRUVSQSCruT98eUdooTmbg4JAk7vxP", + 5, //cosmwasm + "FyWzHEvV3xJKB1LADjQmQQR7A6kv4Dhb261q3rkcDHJq", + "9aUgQeZ3ZABcyBPRodU7Z3pSUZva1xPVviavTLLBG4T5", + //identity cert: + // osmo + // pubkey: 044b272d50d4c1dffaafe8d007ab3257577e1c9d632b0dc3a1d1b9e4b5a6601b796cfe9d2e7e82a1c8bd05e061af87b867cbd1d774accf55e59abc5040683159ef + //to identity: + // compressed: 034b272d50d4c1dffaafe8d007ab3257577e1c9d632b0dc3a1d1b9e4b5a6601b79 + // sha256: 45fdc8b6b25ff3123c4fa5b9798b1ecc6a5b080668b249febcbb986abc779008 + // ripemd160: 98d2155452c1c5f12a928d692e6e9b86c1b4a378 + // bech32: osmo1nrfp24zjc8zlz25j345jum5msmqmfgmcywvq2w + // hex: 6F736D6F316E72667032347A6A63387A6C7A32356A3334356A756D356D736D716D66676D63797776713277 + "2b0000006F736D6F316E72667032347A6A63387A6C7A32356A3334356A756D356D736D716D66676D63797776713277", + "32Uv9RSN56AL574gYx71hh8KFo9b5kAZjvwPpDUWd6ay" + ], [ + "4P65T1mw1YYgY53Xcyuu373MMoFCDzro8j2YWjMx6anY86XQ6F1qvrpZtLK5a1fAntyB7bBdfZ2NryAs8jBttn2J", + 5, //cosmwasm + "FyWzHEvV3xJKB1LADjQmQQR7A6kv4Dhb261q3rkcDHJq", + "9aUgQeZ3ZABcyBPRodU7Z3pSUZva1xPVviavTLLBG4T5", + //identity cert: + // "terra": 050000007465727261 + // signature: 4235e96084a54cc64bd72b07a0b43d170a1968043b901b84754bbe184ca98d062d65c2aa7f06217239039356e70ab8a473179a7f9ed4b6b636aafbed4ca4db7b + // recovery id: 01 + // pubkey: 0452817418f112203e7d5e44cf32adf2e3719cd9b1e5cb7f8cddc02fbb547461d841148cd20d3d8785aaaa27e0cb439e54950423ed104a0e09db137c36d1a5955d + //to identity: + // compressed: 0352817418f112203e7d5e44cf32adf2e3719cd9b1e5cb7f8cddc02fbb547461d8 + // sha256: aa1d3935bb874be86a816377b1200df9248527d4b832ab179eed2b6762b89fdb + // ripemd160: 3a2dcedc027142729ba31954bcbc26d53e3744fe + // bech32: terra18gkuahqzw9p89xarr92te0px65lrw387juhdch + // hex: 74657272613138676B756168717A7739703839786172723932746530707836356C72773338376A7568646368 + "2c00000074657272613138676B756168717A7739703839786172723932746530707836356C72773338376A7568646368", + "4kUMgybdWSimouGckVdSqrD1acGMBUhrufyxjmbWyjT7" + ], [ + "wLcgmj3mhtrjjdinCJJgbYioiaiuNnrTWqTiKpDpC9x6AvSMn6KzTEWXB89VoPk7D5vCEcQvTwyWwkRCaqCHWgm", + 5, //cosmwasm + "FyWzHEvV3xJKB1LADjQmQQR7A6kv4Dhb261q3rkcDHJq", + "9aUgQeZ3ZABcyBPRodU7Z3pSUZva1xPVviavTLLBG4T5", + //identity cert: + // terra + // pubkey: 041c06c8a5da274904afa1800b71bc8cee0c85296f6ef1275372a43f336a82dfb9f5303969b920dabc191c8299ac91700710afcc2c12b6a2a217dbc0f8e00694c1 + //to identity: + // compressed: 031c06c8a5da274904afa1800b71bc8cee0c85296f6ef1275372a43f336a82dfb9 + // sha256: af37810196da2190b20a84c1677301c08c9b455734786e3dedc3826a0cdb2499 + // ripemd160: 747aef95bdd2d86ae829beea634c5b90870eb5b4 + // bech32: terra1w3awl9da6tvx46pfhm4xxnzmjzrsadd5g57phj + // hex: 746572726131773361776C3964613674767834367066686D3478786E7A6D6A7A72736164643567353770686A + "2c000000746572726131773361776C3964613674767834367066686D3478786E7A6D6A7A72736164643567353770686A", + "s6z6UwVvQQNLV8fji2vGovfm7WkkKENQUKxRSTDBjDZ" + ], [ + "5xRyfymFQBL6hKgACFfsxkhEy9Jbxmja236P7VgwKHgVgNAZqmw3yLwST4CiADWKTkA75iuLc8YJN3Tsm8XfkMRm", + 6, //injective + "FyWzHEvV3xJKB1LADjQmQQR7A6kv4Dhb261q3rkcDHJq", + "9aUgQeZ3ZABcyBPRodU7Z3pSUZva1xPVviavTLLBG4T5", + //evm pubkey: db017a14f0be5f2c4e654ac9290c06d3ab41f921 + //https://slowli.github.io/bech32-buffer/ with inj prefix + //bech32: inj1mvqh598she0jcnn9ftyjjrqx6w45r7fpmgavf6 + //asci: 696E6A316D767168353938736865306A636E6E396674796A6A72717836773435723766706D6761766636 + "2a000000696E6A316D767168353938736865306A636E6E396674796A6A72717836773435723766706D6761766636", + "AbYxsUnMoA7x2boxAkjW3ZAVBUGmTDbTUuG9JgB9PUV1" + ] + ] + ], + [ + "WAPGu4AoTGCYbp1iXnZTpBn89VkJNJX3jY7uPuUZAv7", + "29xyJAzhzEeTpwrQQz8JrLethQ4a8UoK29dZRopEAXpW", + [ + [ + "3JQapHPhJAvfEq2UV9ywnmaSLPDrzQtNrJPudqSmXBpUmf6N5svAQWWKTbKVHYNp4ZoEAnY1hr3ibfvB2WpBkABD", + 3, //sui + "73D1CUu581E4FMLBMns6fj2BBDb8Y9MYHhdVBJyictvm", + "7zxEbLsj5VbGb4qvUd5Uo9JjJww97YxP58ggP5yhaaZg", + "8429bc7aa2f902786304faba82f226da97c586a06e850c10574238316e78404a", //https://hashing.tools/blake/blake2b + "DB9LXuNRUvoQmnRLVkZaN23bDpSK63vrpPREAixTW5Ku" + ], [ + "5i7xkSQjnar5vNTKddSdL6aVxuYD44Q1etYynfJuV2VFsQqcTGpfPeeo6qJqkWfDSGfP6fX9XWhaN6p8wTBiAfcF", + 5, //cosmwasm + "Bc6acCmU9WhwDEFG4t37iJHUosMVrQ3sJS4UqnBcEgmf", + "5h1d1xqDgYkqYzqAygwPcABGPb4C98itCEKokq5w2hsa", + //identity cert: + // osmo + // pubkey: 04008b8faad61593a0cae096dbcf474bd45d62f692eaf06c30e90e635e13c7e87d3f2b7580fe5e3383a32651b9e6bd41f8ec21f1d2d64be8269afd4b87ab9fad4c + //to identity: + // compressed: 02008b8faad61593a0cae096dbcf474bd45d62f692eaf06c30e90e635e13c7e87d + // sha256: a3b14dd309cf127d00009f2eeae15020879c782025278aa90b450e4c555be3bf + // ripemd160: 485715c52c7e600d994ffb8672cbccb482a8e924 + // bech32: osmo1fpt3t3fv0esqmx20lwr89j7vkjp236fyk374kj + // hex: 6F736D6F316670743374336676306573716D7832306C777238396A37766B6A7032333666796B3337346B6A + "2b0000006F736D6F316670743374336676306573716D7832306C777238396A37766B6A7032333666796B3337346B6A", + "AnTKt5uMGv3xQY2N5v7XxjhvLH7WpCW4LuAQCZtEvKjn" + ], [ + "2LCat1JPttHvrzTUUXwLz4YGx5gWszQpoHcz9cQuXpuFX1b6pFdfx3CV9yyexrwv4gZh5YnSUJiaGyoFEU5TaQnN", + 7, //algorand + "FyWzHEvV3xJKB1LADjQmQQR7A6kv4Dhb261q3rkcDHJq", + "7yqeeFsxkA5p1jUWcfb22azXUYPajmiA8cqZAEH4Ykkt", + "e76ebbb390cfb012c18396d3ae0e19e98912e00f3ad3b33bdbb70ece3acd547c", + "A7PmVkGkN5f5NNkUCcam2v62k8aaBzqssPWB5Zq2hBNo" + ] + ] + ] +] as const; + +for (const [pId, mint, txs] of txData) + for (const [txHash, ecosystem, claimant, claimantAta, identity, receiptPda] of txs) { + printTxInfo(pId, mint, txHash, ecosystem, claimant, claimantAta, identity, receiptPda); + console.log("=".repeat(80)) + } diff --git a/frontend/claim_sdk/solana.ts b/frontend/claim_sdk/solana.ts index a079ef8f..43da9385 100644 --- a/frontend/claim_sdk/solana.ts +++ b/frontend/claim_sdk/solana.ts @@ -322,71 +322,134 @@ export class TokenDispenserProvider { proofOfInclusion: Uint8Array[], signedMessage: SignedMessage | undefined ): Promise { - // 1. generate claim certificate - // a. create proofOfIdentity - const proofOfIdentity = this.createProofOfIdentity(claimInfo, signedMessage) + const [receiptPda, receiptBump] = this.getReceiptPda(claimInfo) + const { mint } = await this.getConfig() + //same as getClaimantFundAddress / getAssociatedTokenAddress but with bump + const [claimantFund, claimaintFundBump] = PublicKey.findProgramAddressSync( + [ + this.claimant.toBytes(), + splToken.TOKEN_PROGRAM_ID.toBytes(), + mint.toBytes(), + ], + splToken.ASSOCIATED_TOKEN_PROGRAM_ID + ) + const [claimantFundAccount, lookupTableAccount] = await Promise.all([ + this.connection.getAccountInfo(claimantFund), + this.getLookupTableAccount(), + ]) - const claimCert: IdlTypes['ClaimCertificate'] = { - amount: claimInfo.amount, - proofOfIdentity, - proofOfInclusion, - } + const ixs: anchor.web3.TransactionInstruction[] = [] - // 2. generate signature verification instruction if needed + // 1. add signatureVerification instruction if needed const signatureVerificationIx = this.generateSignatureVerificationInstruction( claimInfo.ecosystem, signedMessage ) - // 3. derive receipt pda - const receiptPda = this.getReceiptPda(claimInfo)[0] + if (signatureVerificationIx) ixs.push(signatureVerificationIx) - const lookupTableAccount = await this.getLookupTableAccount() + // 2. add create ATA instruction if needed + const claimantFundExists = claimantFundAccount !== null - const ixs = signatureVerificationIx ? [signatureVerificationIx] : [] - const claim_ix = await this.tokenDispenserProgram.methods - .claim(claimCert) - .accounts({ - funder, - claimant: this.claimant, - claimantFund: await this.getClaimantFundAddress(), - config: this.getConfigPda()[0], - mint: (await this.getConfig()).mint, - treasury, - tokenProgram: TOKEN_PROGRAM_ID, - systemProgram: anchor.web3.SystemProgram.programId, - sysvarInstruction: anchor.web3.SYSVAR_INSTRUCTIONS_PUBKEY, - associatedTokenProgram: splToken.ASSOCIATED_TOKEN_PROGRAM_ID, - }) - .remainingAccounts([ - { - pubkey: receiptPda, - isWritable: true, - isSigner: false, - }, - ]) - .instruction() - ixs.push(claim_ix) - ixs.push(ComputeBudgetProgram.setComputeUnitLimit({ units: 200_000 })) - - const microLamports = 1 //TODO determine true value + if (!claimantFundExists) + ixs.push( + splToken.Token.createAssociatedTokenAccountInstruction( + splToken.ASSOCIATED_TOKEN_PROGRAM_ID, + splToken.TOKEN_PROGRAM_ID, + mint, + claimantFund, + this.claimant, + funder + ) + ) + + // 3. add claim instruction + const proofOfIdentity = this.createProofOfIdentity( + claimInfo, + signedMessage, + 0 + ) + + const claimCert: IdlTypes['ClaimCertificate'] = { + amount: claimInfo.amount, + proofOfIdentity, + proofOfInclusion, + } + + ixs.push( + await this.tokenDispenserProgram.methods + .claim(claimCert) + .accounts({ + funder, + claimant: this.claimant, + claimantFund, + config: this.getConfigPda()[0], + mint, + treasury, + tokenProgram: TOKEN_PROGRAM_ID, + systemProgram: anchor.web3.SystemProgram.programId, + sysvarInstruction: anchor.web3.SYSVAR_INSTRUCTIONS_PUBKEY, + associatedTokenProgram: splToken.ASSOCIATED_TOKEN_PROGRAM_ID, + }) + .remainingAccounts([ + { + pubkey: receiptPda, + isWritable: true, + isSigner: false, + }, + ]) + .instruction() + ) + + // 4. add Compute Unit instructions + const pdaDerivationCosts = (bump: number) => { + const maxBump = 255 + const cusPerPdaDerivation = 1500 + return (maxBump - bump) * cusPerPdaDerivation + } + const safetyMargin = 1000 + const ataCreationCost = 20460 + //determined experimentally: + const ecosystemCUs = { + discord: 44200, + solana: 40450, + evm: 66600, + sui: 79200, + aptos: 78800, + terra: 113500, + osmosis: 113200, + injective: 71700, + algorand: 70700, + } + + const units = + safetyMargin + + ecosystemCUs[claimInfo.ecosystem] + + pdaDerivationCosts(claimaintFundBump) + + pdaDerivationCosts(receiptBump) + + (claimantFundExists + ? 0 + : ataCreationCost + pdaDerivationCosts(claimaintFundBump)) + ixs.push(ComputeBudgetProgram.setComputeUnitLimit({ units })) + + const microLamports = 1_000_000 //somewhat arbitrary choice ixs.push(ComputeBudgetProgram.setComputeUnitPrice({ microLamports })) - const claimTx = new VersionedTransaction( + // 5. build and return the transaction + return new VersionedTransaction( new TransactionMessage({ instructions: ixs, payerKey: funder, recentBlockhash: (await this.connection.getLatestBlockhash()).blockhash, }).compileToV0Message([lookupTableAccount!]) ) - - return claimTx } private createProofOfIdentity( claimInfo: ClaimInfo, - signedMessage: SignedMessage | undefined + signedMessage: SignedMessage | undefined, + verificationInstructionIndex: number ): IdlTypes['IdentityCertificate'] { if (claimInfo.ecosystem === 'solana') { return { @@ -404,7 +467,7 @@ export class TokenDispenserProvider { return { [claimInfo.ecosystem]: { pubkey: Array.from(signedMessage.publicKey), - verificationInstructionIndex: 0, + verificationInstructionIndex, }, } } @@ -424,7 +487,7 @@ export class TokenDispenserProvider { return { discord: { username: claimInfo.identity, - verificationInstructionIndex: 0, + verificationInstructionIndex, }, } } @@ -442,7 +505,8 @@ export class TokenDispenserProvider { private generateSignatureVerificationInstruction( ecosystem: Ecosystem, - signedMessage: SignedMessage | undefined + signedMessage: SignedMessage | undefined, + instructionIndex: number = 0 ): anchor.web3.TransactionInstruction | undefined { if (ecosystem === 'solana') { return undefined @@ -457,6 +521,7 @@ export class TokenDispenserProvider { message: signedMessage.fullMessage, signature: signedMessage.signature, recoveryId: signedMessage.recoveryId!, + instructionIndex, }) } case 'osmosis': @@ -471,7 +536,7 @@ export class TokenDispenserProvider { publicKey: signedMessage.publicKey, message: signedMessage.fullMessage, signature: signedMessage.signature, - instructionIndex: 0, + instructionIndex, }) } default: { diff --git a/frontend/integration/api.test.ts b/frontend/integration/api.test.ts index d8204c7e..eeb8d7b8 100644 --- a/frontend/integration/api.test.ts +++ b/frontend/integration/api.test.ts @@ -1,4 +1,5 @@ import { AnchorProvider, Program } from '@coral-xyz/anchor' +import * as splToken from '@solana/spl-token' import IDL from '../claim_sdk/idl/token_dispenser.json' import { ComputeBudgetProgram, @@ -32,6 +33,7 @@ import { tokenDispenserProgramId } from '../utils/constants' dotenv.config() const tokenDispenserPublicKey = new PublicKey(tokenDispenserProgramId) const WHITELISTED_PROGRAMS: PublicKey[] = [ + splToken.ASSOCIATED_TOKEN_PROGRAM_ID, tokenDispenserPublicKey, Secp256k1Program.programId, Ed25519Program.programId, diff --git a/frontend/integration/api.ts b/frontend/integration/api.ts index f812335a..4a18bfdc 100644 --- a/frontend/integration/api.ts +++ b/frontend/integration/api.ts @@ -5,6 +5,7 @@ import { Secp256k1Program, VersionedTransaction, } from '@solana/web3.js' +import * as splToken from '@solana/spl-token' import { NextApiRequest, NextApiResponse } from 'next' import { TransactionWithPayers, @@ -28,6 +29,7 @@ const wallets = loadFunderWallets() const tokenDispenserPublicKey = new PublicKey(tokenDispenserProgramId) const WHITELISTED_PROGRAMS: PublicKey[] = [ + splToken.ASSOCIATED_TOKEN_PROGRAM_ID, tokenDispenserPublicKey, Secp256k1Program.programId, Ed25519Program.programId, diff --git a/frontend/utils/verifyTransaction.ts b/frontend/utils/verifyTransaction.ts index 98e3b1f1..dbefa5a9 100644 --- a/frontend/utils/verifyTransaction.ts +++ b/frontend/utils/verifyTransaction.ts @@ -88,7 +88,7 @@ export function checkSetComputeBudgetInstructionsAreSetComputeUnitPrice( const priorityFee = ComputeBudgetInstruction.decodeSetComputeUnitPrice( legacTransactionInstruction ) - if (priorityFee.microLamports >= MAX_COMPUTE_UNIT_PRICE) { + if (priorityFee.microLamports > MAX_COMPUTE_UNIT_PRICE) { return false } }