crypto-aio 0.0.2 → 0.1.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/CHANGELOG.md +17 -0
- package/README.md +144 -14
- package/dist/adapters/avalanche/address.d.ts +15 -0
- package/dist/adapters/avalanche/address.js +74 -0
- package/dist/adapters/avalanche/address.js.map +1 -0
- package/dist/adapters/avalanche/api.d.ts +100 -0
- package/dist/adapters/avalanche/api.js +381 -0
- package/dist/adapters/avalanche/api.js.map +1 -0
- package/dist/adapters/avalanche/builder.d.ts +13 -0
- package/dist/adapters/avalanche/builder.js +336 -0
- package/dist/adapters/avalanche/builder.js.map +1 -0
- package/dist/adapters/avalanche/cb58.d.ts +7 -0
- package/dist/adapters/avalanche/cb58.js +49 -0
- package/dist/adapters/avalanche/cb58.js.map +1 -0
- package/dist/adapters/avalanche/chains.d.ts +21 -0
- package/dist/adapters/avalanche/chains.js +79 -0
- package/dist/adapters/avalanche/chains.js.map +1 -0
- package/dist/adapters/avalanche/codec.d.ts +94 -0
- package/dist/adapters/avalanche/codec.js +371 -0
- package/dist/adapters/avalanche/codec.js.map +1 -0
- package/dist/adapters/avalanche/context.d.ts +59 -0
- package/dist/adapters/avalanche/context.js +114 -0
- package/dist/adapters/avalanche/context.js.map +1 -0
- package/dist/adapters/avalanche/decode.d.ts +16 -0
- package/dist/adapters/avalanche/decode.js +101 -0
- package/dist/adapters/avalanche/decode.js.map +1 -0
- package/dist/adapters/avalanche/driver.d.ts +22 -0
- package/dist/adapters/avalanche/driver.js +81 -0
- package/dist/adapters/avalanche/driver.js.map +1 -0
- package/dist/adapters/avalanche/errors.d.ts +18 -0
- package/dist/adapters/avalanche/errors.js +61 -0
- package/dist/adapters/avalanche/errors.js.map +1 -0
- package/dist/adapters/avalanche/fees.d.ts +23 -0
- package/dist/adapters/avalanche/fees.js +105 -0
- package/dist/adapters/avalanche/fees.js.map +1 -0
- package/dist/adapters/avalanche/index.d.ts +19 -0
- package/dist/adapters/avalanche/index.js +8 -0
- package/dist/adapters/avalanche/index.js.map +1 -0
- package/dist/adapters/avalanche/network.d.ts +37 -0
- package/dist/adapters/avalanche/network.js +135 -0
- package/dist/adapters/avalanche/network.js.map +1 -0
- package/dist/adapters/avalanche/plugin.d.ts +21 -0
- package/dist/adapters/avalanche/plugin.js +46 -0
- package/dist/adapters/avalanche/plugin.js.map +1 -0
- package/dist/adapters/avalanche/presets.d.ts +6 -0
- package/dist/adapters/avalanche/presets.js +86 -0
- package/dist/adapters/avalanche/presets.js.map +1 -0
- package/dist/adapters/avalanche/proofs.d.ts +41 -0
- package/dist/adapters/avalanche/proofs.js +270 -0
- package/dist/adapters/avalanche/proofs.js.map +1 -0
- package/dist/adapters/avalanche/reader.d.ts +40 -0
- package/dist/adapters/avalanche/reader.js +231 -0
- package/dist/adapters/avalanche/reader.js.map +1 -0
- package/dist/adapters/avalanche/sdk.d.ts +182 -0
- package/dist/adapters/avalanche/sdk.js +21 -0
- package/dist/adapters/avalanche/sdk.js.map +1 -0
- package/dist/adapters/avalanche/types.d.ts +86 -0
- package/dist/{type/common.js → adapters/avalanche/types.js} +1 -1
- package/dist/adapters/avalanche/types.js.map +1 -0
- package/dist/adapters/evm/builder.d.ts +11 -0
- package/dist/adapters/evm/builder.js +326 -0
- package/dist/adapters/evm/builder.js.map +1 -0
- package/dist/adapters/evm/chains.d.ts +6 -0
- package/dist/adapters/evm/chains.js +203 -0
- package/dist/adapters/evm/chains.js.map +1 -0
- package/dist/adapters/evm/client.d.ts +84 -0
- package/dist/adapters/evm/client.js +335 -0
- package/dist/adapters/evm/client.js.map +1 -0
- package/dist/adapters/evm/decode.d.ts +35 -0
- package/dist/adapters/evm/decode.js +170 -0
- package/dist/adapters/evm/decode.js.map +1 -0
- package/dist/adapters/evm/driver.d.ts +8 -0
- package/dist/adapters/evm/driver.js +61 -0
- package/dist/adapters/evm/driver.js.map +1 -0
- package/dist/adapters/evm/errors.d.ts +20 -0
- package/dist/adapters/evm/errors.js +110 -0
- package/dist/adapters/evm/errors.js.map +1 -0
- package/dist/adapters/evm/ethers-client.d.ts +43 -0
- package/dist/adapters/evm/ethers-client.js +135 -0
- package/dist/adapters/evm/ethers-client.js.map +1 -0
- package/dist/adapters/evm/fees.d.ts +79 -0
- package/dist/adapters/evm/fees.js +234 -0
- package/dist/adapters/evm/fees.js.map +1 -0
- package/dist/adapters/evm/index.d.ts +20 -0
- package/dist/adapters/evm/index.js +11 -0
- package/dist/adapters/evm/index.js.map +1 -0
- package/dist/adapters/evm/network.d.ts +60 -0
- package/dist/adapters/evm/network.js +131 -0
- package/dist/adapters/evm/network.js.map +1 -0
- package/dist/adapters/evm/plugin.d.ts +36 -0
- package/dist/adapters/evm/plugin.js +102 -0
- package/dist/adapters/evm/plugin.js.map +1 -0
- package/dist/adapters/evm/presets.d.ts +2 -0
- package/dist/adapters/evm/presets.js +105 -0
- package/dist/adapters/evm/presets.js.map +1 -0
- package/dist/adapters/evm/proofs.d.ts +19 -0
- package/dist/adapters/evm/proofs.js +358 -0
- package/dist/adapters/evm/proofs.js.map +1 -0
- package/dist/adapters/evm/rawtx.d.ts +25 -0
- package/dist/adapters/evm/rawtx.js +176 -0
- package/dist/adapters/evm/rawtx.js.map +1 -0
- package/dist/adapters/evm/reader.d.ts +65 -0
- package/dist/adapters/evm/reader.js +292 -0
- package/dist/adapters/evm/reader.js.map +1 -0
- package/dist/adapters/evm/rpc.d.ts +39 -0
- package/dist/adapters/evm/rpc.js +152 -0
- package/dist/adapters/evm/rpc.js.map +1 -0
- package/dist/adapters/evm/tokens.d.ts +7 -0
- package/dist/adapters/evm/tokens.js +23 -0
- package/dist/adapters/evm/tokens.js.map +1 -0
- package/dist/adapters/evm/types.d.ts +255 -0
- package/dist/{type/account.js → adapters/evm/types.js} +1 -1
- package/dist/adapters/evm/types.js.map +1 -0
- package/dist/adapters/evm/web3-client.d.ts +23 -0
- package/dist/adapters/evm/web3-client.js +159 -0
- package/dist/adapters/evm/web3-client.js.map +1 -0
- package/dist/adapters/solana/builder.d.ts +18 -0
- package/dist/adapters/solana/builder.js +545 -0
- package/dist/adapters/solana/builder.js.map +1 -0
- package/dist/adapters/solana/chains.d.ts +13 -0
- package/dist/adapters/solana/chains.js +37 -0
- package/dist/adapters/solana/chains.js.map +1 -0
- package/dist/adapters/solana/decode.d.ts +111 -0
- package/dist/adapters/solana/decode.js +595 -0
- package/dist/adapters/solana/decode.js.map +1 -0
- package/dist/adapters/solana/driver.d.ts +15 -0
- package/dist/adapters/solana/driver.js +72 -0
- package/dist/adapters/solana/driver.js.map +1 -0
- package/dist/adapters/solana/errors.d.ts +36 -0
- package/dist/adapters/solana/errors.js +154 -0
- package/dist/adapters/solana/errors.js.map +1 -0
- package/dist/adapters/solana/fees.d.ts +68 -0
- package/dist/adapters/solana/fees.js +205 -0
- package/dist/adapters/solana/fees.js.map +1 -0
- package/dist/adapters/solana/heights.d.ts +47 -0
- package/dist/adapters/solana/heights.js +185 -0
- package/dist/adapters/solana/heights.js.map +1 -0
- package/dist/adapters/solana/history.d.ts +10 -0
- package/dist/adapters/solana/history.js +71 -0
- package/dist/adapters/solana/history.js.map +1 -0
- package/dist/adapters/solana/index.d.ts +16 -0
- package/dist/adapters/solana/index.js +9 -0
- package/dist/adapters/solana/index.js.map +1 -0
- package/dist/adapters/solana/keys.d.ts +13 -0
- package/dist/adapters/solana/keys.js +69 -0
- package/dist/adapters/solana/keys.js.map +1 -0
- package/dist/adapters/solana/network.d.ts +24 -0
- package/dist/adapters/solana/network.js +95 -0
- package/dist/adapters/solana/network.js.map +1 -0
- package/dist/adapters/solana/plugin.d.ts +18 -0
- package/dist/adapters/solana/plugin.js +41 -0
- package/dist/adapters/solana/plugin.js.map +1 -0
- package/dist/adapters/solana/presets.d.ts +2 -0
- package/dist/adapters/solana/presets.js +77 -0
- package/dist/adapters/solana/presets.js.map +1 -0
- package/dist/adapters/solana/programs.d.ts +44 -0
- package/dist/adapters/solana/programs.js +159 -0
- package/dist/adapters/solana/programs.js.map +1 -0
- package/dist/adapters/solana/proofs.d.ts +56 -0
- package/dist/adapters/solana/proofs.js +540 -0
- package/dist/adapters/solana/proofs.js.map +1 -0
- package/dist/adapters/solana/reader.d.ts +82 -0
- package/dist/adapters/solana/reader.js +326 -0
- package/dist/adapters/solana/reader.js.map +1 -0
- package/dist/adapters/solana/rpc.d.ts +102 -0
- package/dist/adapters/solana/rpc.js +301 -0
- package/dist/adapters/solana/rpc.js.map +1 -0
- package/dist/adapters/solana/tokens.d.ts +7 -0
- package/dist/adapters/solana/tokens.js +19 -0
- package/dist/adapters/solana/tokens.js.map +1 -0
- package/dist/adapters/solana/types.d.ts +121 -0
- package/dist/{type/lib-types.js → adapters/solana/types.js} +1 -1
- package/dist/adapters/solana/types.js.map +1 -0
- package/dist/adapters/solana/web3.d.ts +5 -0
- package/dist/adapters/solana/web3.js +83 -0
- package/dist/adapters/solana/web3.js.map +1 -0
- package/dist/adapters/solana/wire.d.ts +62 -0
- package/dist/adapters/solana/wire.js +168 -0
- package/dist/adapters/solana/wire.js.map +1 -0
- package/dist/adapters/ton/address.d.ts +43 -0
- package/dist/adapters/ton/address.js +168 -0
- package/dist/adapters/ton/address.js.map +1 -0
- package/dist/adapters/ton/api.d.ts +344 -0
- package/dist/adapters/ton/api.js +942 -0
- package/dist/adapters/ton/api.js.map +1 -0
- package/dist/adapters/ton/builder.d.ts +18 -0
- package/dist/adapters/ton/builder.js +701 -0
- package/dist/adapters/ton/builder.js.map +1 -0
- package/dist/adapters/ton/chains.d.ts +16 -0
- package/dist/adapters/ton/chains.js +39 -0
- package/dist/adapters/ton/chains.js.map +1 -0
- package/dist/adapters/ton/decode.d.ts +43 -0
- package/dist/adapters/ton/decode.js +219 -0
- package/dist/adapters/ton/decode.js.map +1 -0
- package/dist/adapters/ton/driver.d.ts +10 -0
- package/dist/adapters/ton/driver.js +117 -0
- package/dist/adapters/ton/driver.js.map +1 -0
- package/dist/adapters/ton/errors.d.ts +36 -0
- package/dist/adapters/ton/errors.js +89 -0
- package/dist/adapters/ton/errors.js.map +1 -0
- package/dist/adapters/ton/fees.d.ts +28 -0
- package/dist/adapters/ton/fees.js +121 -0
- package/dist/adapters/ton/fees.js.map +1 -0
- package/dist/adapters/ton/index.d.ts +16 -0
- package/dist/adapters/ton/index.js +9 -0
- package/dist/adapters/ton/index.js.map +1 -0
- package/dist/adapters/ton/messages.d.ts +157 -0
- package/dist/adapters/ton/messages.js +397 -0
- package/dist/adapters/ton/messages.js.map +1 -0
- package/dist/adapters/ton/native-client.d.ts +10 -0
- package/dist/adapters/ton/native-client.js +47 -0
- package/dist/adapters/ton/native-client.js.map +1 -0
- package/dist/adapters/ton/network.d.ts +58 -0
- package/dist/adapters/ton/network.js +207 -0
- package/dist/adapters/ton/network.js.map +1 -0
- package/dist/adapters/ton/plugin.d.ts +24 -0
- package/dist/adapters/ton/plugin.js +57 -0
- package/dist/adapters/ton/plugin.js.map +1 -0
- package/dist/adapters/ton/presets.d.ts +6 -0
- package/dist/adapters/ton/presets.js +94 -0
- package/dist/adapters/ton/presets.js.map +1 -0
- package/dist/adapters/ton/proofs.d.ts +66 -0
- package/dist/adapters/ton/proofs.js +813 -0
- package/dist/adapters/ton/proofs.js.map +1 -0
- package/dist/adapters/ton/reader.d.ts +194 -0
- package/dist/adapters/ton/reader.js +781 -0
- package/dist/adapters/ton/reader.js.map +1 -0
- package/dist/adapters/ton/tokens.d.ts +10 -0
- package/dist/adapters/ton/tokens.js +27 -0
- package/dist/adapters/ton/tokens.js.map +1 -0
- package/dist/adapters/ton/trace.d.ts +48 -0
- package/dist/adapters/ton/trace.js +277 -0
- package/dist/adapters/ton/trace.js.map +1 -0
- package/dist/adapters/ton/types.d.ts +105 -0
- package/dist/adapters/ton/types.js +3 -0
- package/dist/adapters/ton/types.js.map +1 -0
- package/dist/adapters/ton/wallets.d.ts +86 -0
- package/dist/adapters/ton/wallets.js +373 -0
- package/dist/adapters/ton/wallets.js.map +1 -0
- package/dist/adapters/tron/abi.d.ts +39 -0
- package/dist/adapters/tron/abi.js +110 -0
- package/dist/adapters/tron/abi.js.map +1 -0
- package/dist/adapters/tron/address.d.ts +20 -0
- package/dist/adapters/tron/address.js +110 -0
- package/dist/adapters/tron/address.js.map +1 -0
- package/dist/adapters/tron/builder.d.ts +12 -0
- package/dist/adapters/tron/builder.js +553 -0
- package/dist/adapters/tron/builder.js.map +1 -0
- package/dist/adapters/tron/chains.d.ts +12 -0
- package/dist/adapters/tron/chains.js +35 -0
- package/dist/adapters/tron/chains.js.map +1 -0
- package/dist/adapters/tron/codec.d.ts +10 -0
- package/dist/adapters/tron/codec.js +322 -0
- package/dist/adapters/tron/codec.js.map +1 -0
- package/dist/adapters/tron/decode.d.ts +50 -0
- package/dist/adapters/tron/decode.js +280 -0
- package/dist/adapters/tron/decode.js.map +1 -0
- package/dist/adapters/tron/driver.d.ts +12 -0
- package/dist/adapters/tron/driver.js +106 -0
- package/dist/adapters/tron/driver.js.map +1 -0
- package/dist/adapters/tron/errors.d.ts +74 -0
- package/dist/adapters/tron/errors.js +261 -0
- package/dist/adapters/tron/errors.js.map +1 -0
- package/dist/adapters/tron/fees.d.ts +49 -0
- package/dist/adapters/tron/fees.js +166 -0
- package/dist/adapters/tron/fees.js.map +1 -0
- package/dist/adapters/tron/http.d.ts +173 -0
- package/dist/adapters/tron/http.js +729 -0
- package/dist/adapters/tron/http.js.map +1 -0
- package/dist/adapters/tron/index.d.ts +16 -0
- package/dist/adapters/tron/index.js +15 -0
- package/dist/adapters/tron/index.js.map +1 -0
- package/dist/adapters/tron/network.d.ts +44 -0
- package/dist/adapters/tron/network.js +163 -0
- package/dist/adapters/tron/network.js.map +1 -0
- package/dist/adapters/tron/plugin.d.ts +17 -0
- package/dist/adapters/tron/plugin.js +39 -0
- package/dist/adapters/tron/plugin.js.map +1 -0
- package/dist/adapters/tron/presets.d.ts +5 -0
- package/dist/adapters/tron/presets.js +68 -0
- package/dist/adapters/tron/presets.js.map +1 -0
- package/dist/adapters/tron/proofs.d.ts +80 -0
- package/dist/adapters/tron/proofs.js +370 -0
- package/dist/adapters/tron/proofs.js.map +1 -0
- package/dist/adapters/tron/protobuf.d.ts +36 -0
- package/dist/adapters/tron/protobuf.js +90 -0
- package/dist/adapters/tron/protobuf.js.map +1 -0
- package/dist/adapters/tron/reader.d.ts +47 -0
- package/dist/adapters/tron/reader.js +203 -0
- package/dist/adapters/tron/reader.js.map +1 -0
- package/dist/adapters/tron/tokens.d.ts +7 -0
- package/dist/adapters/tron/tokens.js +14 -0
- package/dist/adapters/tron/tokens.js.map +1 -0
- package/dist/adapters/tron/types.d.ts +166 -0
- package/dist/adapters/tron/types.js +3 -0
- package/dist/adapters/tron/types.js.map +1 -0
- package/dist/adapters/utxo/address.d.ts +51 -0
- package/dist/adapters/utxo/address.js +341 -0
- package/dist/adapters/utxo/address.js.map +1 -0
- package/dist/adapters/utxo/builder.d.ts +35 -0
- package/dist/adapters/utxo/builder.js +380 -0
- package/dist/adapters/utxo/builder.js.map +1 -0
- package/dist/adapters/utxo/chains.d.ts +17 -0
- package/dist/adapters/utxo/chains.js +99 -0
- package/dist/adapters/utxo/chains.js.map +1 -0
- package/dist/adapters/utxo/codec.d.ts +120 -0
- package/dist/adapters/utxo/codec.js +408 -0
- package/dist/adapters/utxo/codec.js.map +1 -0
- package/dist/adapters/utxo/coinselect.d.ts +48 -0
- package/dist/adapters/utxo/coinselect.js +131 -0
- package/dist/adapters/utxo/coinselect.js.map +1 -0
- package/dist/adapters/utxo/context.d.ts +57 -0
- package/dist/adapters/utxo/context.js +118 -0
- package/dist/adapters/utxo/context.js.map +1 -0
- package/dist/adapters/utxo/decode.d.ts +14 -0
- package/dist/adapters/utxo/decode.js +85 -0
- package/dist/adapters/utxo/decode.js.map +1 -0
- package/dist/adapters/utxo/driver.d.ts +16 -0
- package/dist/adapters/utxo/driver.js +74 -0
- package/dist/adapters/utxo/driver.js.map +1 -0
- package/dist/adapters/utxo/ecc.d.ts +9 -0
- package/dist/adapters/utxo/ecc.js +26 -0
- package/dist/adapters/utxo/ecc.js.map +1 -0
- package/dist/adapters/utxo/errors.d.ts +52 -0
- package/dist/adapters/utxo/errors.js +191 -0
- package/dist/adapters/utxo/errors.js.map +1 -0
- package/dist/adapters/utxo/esplora.d.ts +79 -0
- package/dist/adapters/utxo/esplora.js +451 -0
- package/dist/adapters/utxo/esplora.js.map +1 -0
- package/dist/adapters/utxo/fees.d.ts +41 -0
- package/dist/adapters/utxo/fees.js +125 -0
- package/dist/adapters/utxo/fees.js.map +1 -0
- package/dist/adapters/utxo/index.d.ts +17 -0
- package/dist/adapters/utxo/index.js +8 -0
- package/dist/adapters/utxo/index.js.map +1 -0
- package/dist/adapters/utxo/network.d.ts +50 -0
- package/dist/adapters/utxo/network.js +165 -0
- package/dist/adapters/utxo/network.js.map +1 -0
- package/dist/adapters/utxo/plugin.d.ts +17 -0
- package/dist/adapters/utxo/plugin.js +41 -0
- package/dist/adapters/utxo/plugin.js.map +1 -0
- package/dist/adapters/utxo/presets.d.ts +12 -0
- package/dist/adapters/utxo/presets.js +47 -0
- package/dist/adapters/utxo/presets.js.map +1 -0
- package/dist/adapters/utxo/preview.d.ts +3 -0
- package/dist/adapters/utxo/preview.js +65 -0
- package/dist/adapters/utxo/preview.js.map +1 -0
- package/dist/adapters/utxo/proofs.d.ts +57 -0
- package/dist/adapters/utxo/proofs.js +331 -0
- package/dist/adapters/utxo/proofs.js.map +1 -0
- package/dist/adapters/utxo/rawtx.d.ts +59 -0
- package/dist/adapters/utxo/rawtx.js +234 -0
- package/dist/adapters/utxo/rawtx.js.map +1 -0
- package/dist/adapters/utxo/reader.d.ts +36 -0
- package/dist/adapters/utxo/reader.js +265 -0
- package/dist/adapters/utxo/reader.js.map +1 -0
- package/dist/adapters/utxo/sdk.d.ts +18 -0
- package/dist/adapters/utxo/sdk.js +17 -0
- package/dist/adapters/utxo/sdk.js.map +1 -0
- package/dist/adapters/utxo/signed-psbt.d.ts +36 -0
- package/dist/adapters/utxo/signed-psbt.js +428 -0
- package/dist/adapters/utxo/signed-psbt.js.map +1 -0
- package/dist/adapters/utxo/spend.d.ts +59 -0
- package/dist/adapters/utxo/spend.js +230 -0
- package/dist/adapters/utxo/spend.js.map +1 -0
- package/dist/adapters/utxo/types.d.ts +167 -0
- package/dist/adapters/utxo/types.js +3 -0
- package/dist/adapters/utxo/types.js.map +1 -0
- package/dist/core/assets/service.d.ts +18 -0
- package/dist/core/assets/service.js +69 -0
- package/dist/core/assets/service.js.map +1 -0
- package/dist/core/blockchain/default-ref.d.ts +4 -0
- package/dist/core/blockchain/default-ref.js +16 -0
- package/dist/core/blockchain/default-ref.js.map +1 -0
- package/dist/core/blockchain/handle.d.ts +200 -0
- package/dist/core/blockchain/handle.js +579 -0
- package/dist/core/blockchain/handle.js.map +1 -0
- package/dist/core/blockchain/internal.d.ts +19 -0
- package/dist/core/blockchain/internal.js +16 -0
- package/dist/core/blockchain/internal.js.map +1 -0
- package/dist/core/blockchain/mapping.d.ts +22 -0
- package/dist/core/blockchain/mapping.js +136 -0
- package/dist/core/blockchain/mapping.js.map +1 -0
- package/dist/core/config/env.d.ts +8 -0
- package/dist/core/config/env.js +60 -0
- package/dist/core/config/env.js.map +1 -0
- package/dist/core/config/merge.d.ts +26 -0
- package/dist/core/config/merge.js +144 -0
- package/dist/core/config/merge.js.map +1 -0
- package/dist/core/config/resolve.d.ts +12 -0
- package/dist/core/config/resolve.js +251 -0
- package/dist/core/config/resolve.js.map +1 -0
- package/dist/core/config/types.d.ts +165 -0
- package/dist/core/config/types.js +3 -0
- package/dist/core/config/types.js.map +1 -0
- package/dist/core/container/builtins.d.ts +4 -0
- package/dist/core/container/builtins.js +13 -0
- package/dist/core/container/builtins.js.map +1 -0
- package/dist/core/container/container.d.ts +69 -0
- package/dist/core/container/container.js +466 -0
- package/dist/core/container/container.js.map +1 -0
- package/dist/core/container/default.d.ts +15 -0
- package/dist/core/container/default.js +70 -0
- package/dist/core/container/default.js.map +1 -0
- package/dist/core/container/internals.d.ts +54 -0
- package/dist/core/container/internals.js +21 -0
- package/dist/core/container/internals.js.map +1 -0
- package/dist/core/container/pool.d.ts +27 -0
- package/dist/core/container/pool.js +77 -0
- package/dist/core/container/pool.js.map +1 -0
- package/dist/core/driver/types.d.ts +346 -0
- package/dist/core/driver/types.js +3 -0
- package/dist/core/driver/types.js.map +1 -0
- package/dist/core/errors/codes.d.ts +153 -0
- package/dist/core/errors/codes.js +49 -0
- package/dist/core/errors/codes.js.map +1 -0
- package/dist/core/errors/error.d.ts +66 -0
- package/dist/core/errors/error.js +129 -0
- package/dist/core/errors/error.js.map +1 -0
- package/dist/core/events/bus.d.ts +12 -0
- package/dist/core/events/bus.js +46 -0
- package/dist/core/events/bus.js.map +1 -0
- package/dist/core/events/logger.d.ts +13 -0
- package/dist/core/events/logger.js +42 -0
- package/dist/core/events/logger.js.map +1 -0
- package/dist/core/events/types.d.ts +131 -0
- package/dist/core/events/types.js +3 -0
- package/dist/core/events/types.js.map +1 -0
- package/dist/core/lifecycle/engine-rules.d.ts +107 -0
- package/dist/core/lifecycle/engine-rules.js +257 -0
- package/dist/core/lifecycle/engine-rules.js.map +1 -0
- package/dist/core/lifecycle/engine.d.ts +500 -0
- package/dist/core/lifecycle/engine.js +1732 -0
- package/dist/core/lifecycle/engine.js.map +1 -0
- package/dist/core/lifecycle/evaluate.d.ts +19 -0
- package/dist/core/lifecycle/evaluate.js +72 -0
- package/dist/core/lifecycle/evaluate.js.map +1 -0
- package/dist/core/lifecycle/intent.d.ts +11 -0
- package/dist/core/lifecycle/intent.js +88 -0
- package/dist/core/lifecycle/intent.js.map +1 -0
- package/dist/core/lifecycle/monitor.d.ts +138 -0
- package/dist/core/lifecycle/monitor.js +606 -0
- package/dist/core/lifecycle/monitor.js.map +1 -0
- package/dist/core/lifecycle/observations.d.ts +17 -0
- package/dist/core/lifecycle/observations.js +59 -0
- package/dist/core/lifecycle/observations.js.map +1 -0
- package/dist/core/lifecycle/reconcile.d.ts +58 -0
- package/dist/core/lifecycle/reconcile.js +112 -0
- package/dist/core/lifecycle/reconcile.js.map +1 -0
- package/dist/core/lifecycle/views.d.ts +49 -0
- package/dist/core/lifecycle/views.js +57 -0
- package/dist/core/lifecycle/views.js.map +1 -0
- package/dist/core/lifecycle/workers.d.ts +82 -0
- package/dist/core/lifecycle/workers.js +329 -0
- package/dist/core/lifecycle/workers.js.map +1 -0
- package/dist/core/model/address.d.ts +32 -0
- package/dist/core/model/address.js +43 -0
- package/dist/core/model/address.js.map +1 -0
- package/dist/core/model/amount.d.ts +25 -0
- package/dist/core/model/amount.js +102 -0
- package/dist/core/model/amount.js.map +1 -0
- package/dist/core/model/asset.d.ts +28 -0
- package/dist/core/model/asset.js +47 -0
- package/dist/core/model/asset.js.map +1 -0
- package/dist/core/model/capability.d.ts +3 -0
- package/dist/core/model/capability.js +18 -0
- package/dist/core/model/capability.js.map +1 -0
- package/dist/core/model/chain.d.ts +63 -0
- package/dist/core/model/chain.js +8 -0
- package/dist/core/model/chain.js.map +1 -0
- package/dist/core/model/fee.d.ts +36 -0
- package/dist/core/model/fee.js +17 -0
- package/dist/core/model/fee.js.map +1 -0
- package/dist/core/model/ids.d.ts +37 -0
- package/dist/core/model/ids.js +13 -0
- package/dist/core/model/ids.js.map +1 -0
- package/dist/core/model/intent.d.ts +63 -0
- package/dist/core/model/intent.js +81 -0
- package/dist/core/model/intent.js.map +1 -0
- package/dist/core/model/ordering.d.ts +20 -0
- package/dist/core/model/ordering.js +29 -0
- package/dist/core/model/ordering.js.map +1 -0
- package/dist/core/model/transaction.d.ts +116 -0
- package/dist/core/model/transaction.js +3 -0
- package/dist/core/model/transaction.js.map +1 -0
- package/dist/core/observe/scanner.d.ts +135 -0
- package/dist/core/observe/scanner.js +355 -0
- package/dist/core/observe/scanner.js.map +1 -0
- package/dist/core/ordering/reservations.d.ts +16 -0
- package/dist/core/ordering/reservations.js +53 -0
- package/dist/core/ordering/reservations.js.map +1 -0
- package/dist/core/ordering/sequence.d.ts +61 -0
- package/dist/core/ordering/sequence.js +155 -0
- package/dist/core/ordering/sequence.js.map +1 -0
- package/dist/core/registry/adapters.d.ts +10 -0
- package/dist/core/registry/adapters.js +56 -0
- package/dist/core/registry/adapters.js.map +1 -0
- package/dist/core/registry/assets.d.ts +18 -0
- package/dist/core/registry/assets.js +90 -0
- package/dist/core/registry/assets.js.map +1 -0
- package/dist/core/registry/chains.d.ts +10 -0
- package/dist/core/registry/chains.js +80 -0
- package/dist/core/registry/chains.js.map +1 -0
- package/dist/core/registry/plugin.d.ts +41 -0
- package/dist/core/registry/plugin.js +109 -0
- package/dist/core/registry/plugin.js.map +1 -0
- package/dist/core/registry/providers.d.ts +31 -0
- package/dist/core/registry/providers.js +43 -0
- package/dist/core/registry/providers.js.map +1 -0
- package/dist/core/registry/schemes.d.ts +30 -0
- package/dist/core/registry/schemes.js +84 -0
- package/dist/core/registry/schemes.js.map +1 -0
- package/dist/core/secret/fragments.d.ts +33 -0
- package/dist/core/secret/fragments.js +110 -0
- package/dist/core/secret/fragments.js.map +1 -0
- package/dist/core/secret/redact.d.ts +10 -0
- package/dist/core/secret/redact.js +110 -0
- package/dist/core/secret/redact.js.map +1 -0
- package/dist/core/secret/secret.d.ts +14 -0
- package/dist/core/secret/secret.js +42 -0
- package/dist/core/secret/secret.js.map +1 -0
- package/dist/core/signing/callback.d.ts +10 -0
- package/dist/core/signing/callback.js +22 -0
- package/dist/core/signing/callback.js.map +1 -0
- package/dist/core/signing/guard.d.ts +18 -0
- package/dist/core/signing/guard.js +72 -0
- package/dist/core/signing/guard.js.map +1 -0
- package/dist/core/signing/hd.d.ts +36 -0
- package/dist/core/signing/hd.js +167 -0
- package/dist/core/signing/hd.js.map +1 -0
- package/dist/core/signing/local.d.ts +48 -0
- package/dist/core/signing/local.js +190 -0
- package/dist/core/signing/local.js.map +1 -0
- package/dist/core/signing/orchestrator.d.ts +40 -0
- package/dist/core/signing/orchestrator.js +300 -0
- package/dist/core/signing/orchestrator.js.map +1 -0
- package/dist/core/signing/types.d.ts +64 -0
- package/dist/core/signing/types.js +3 -0
- package/dist/core/signing/types.js.map +1 -0
- package/dist/core/signing/wallet.d.ts +48 -0
- package/dist/core/signing/wallet.js +153 -0
- package/dist/core/signing/wallet.js.map +1 -0
- package/dist/core/store/clone.d.ts +25 -0
- package/dist/core/store/clone.js +71 -0
- package/dist/core/store/clone.js.map +1 -0
- package/dist/core/store/memory.d.ts +38 -0
- package/dist/core/store/memory.js +325 -0
- package/dist/core/store/memory.js.map +1 -0
- package/dist/core/store/types.d.ts +246 -0
- package/dist/core/store/types.js +117 -0
- package/dist/core/store/types.js.map +1 -0
- package/dist/core/transport/backoff.d.ts +8 -0
- package/dist/core/transport/backoff.js +27 -0
- package/dist/core/transport/backoff.js.map +1 -0
- package/dist/core/transport/circuit.d.ts +25 -0
- package/dist/core/transport/circuit.js +61 -0
- package/dist/core/transport/circuit.js.map +1 -0
- package/dist/core/transport/http-transport.d.ts +30 -0
- package/dist/core/transport/http-transport.js +1695 -0
- package/dist/core/transport/http-transport.js.map +1 -0
- package/dist/core/transport/rate-limit.d.ts +27 -0
- package/dist/core/transport/rate-limit.js +78 -0
- package/dist/core/transport/rate-limit.js.map +1 -0
- package/dist/core/transport/stale-view.d.ts +11 -0
- package/dist/core/transport/stale-view.js +17 -0
- package/dist/core/transport/stale-view.js.map +1 -0
- package/dist/core/transport/types.d.ts +144 -0
- package/dist/core/transport/types.js +6 -0
- package/dist/core/transport/types.js.map +1 -0
- package/dist/core/util/bytes.d.ts +9 -0
- package/dist/core/util/bytes.js +40 -0
- package/dist/core/util/bytes.js.map +1 -0
- package/dist/core/util/clock.d.ts +6 -0
- package/dist/core/util/clock.js +26 -0
- package/dist/core/util/clock.js.map +1 -0
- package/dist/core/util/freeze.d.ts +8 -0
- package/dist/core/util/freeze.js +31 -0
- package/dist/core/util/freeze.js.map +1 -0
- package/dist/core/util/json.d.ts +29 -0
- package/dist/core/util/json.js +165 -0
- package/dist/core/util/json.js.map +1 -0
- package/dist/core/util/names.d.ts +21 -0
- package/dist/core/util/names.js +46 -0
- package/dist/core/util/names.js.map +1 -0
- package/dist/index.d.ts +64 -14
- package/dist/index.js +105 -49
- package/dist/index.js.map +1 -1
- package/dist/native.d.ts +21 -0
- package/dist/native.js +44 -0
- package/dist/native.js.map +1 -0
- package/dist/testing/contracts/api.d.ts +12 -0
- package/dist/testing/contracts/api.js +58 -0
- package/dist/testing/contracts/api.js.map +1 -0
- package/dist/testing/contracts/cursors.d.ts +6 -0
- package/dist/testing/contracts/cursors.js +43 -0
- package/dist/testing/contracts/cursors.js.map +1 -0
- package/dist/testing/contracts/locks.d.ts +10 -0
- package/dist/testing/contracts/locks.js +63 -0
- package/dist/testing/contracts/locks.js.map +1 -0
- package/dist/testing/contracts/operations.d.ts +21 -0
- package/dist/testing/contracts/operations.js +718 -0
- package/dist/testing/contracts/operations.js.map +1 -0
- package/dist/testing/contracts/sequences.d.ts +6 -0
- package/dist/testing/contracts/sequences.js +68 -0
- package/dist/testing/contracts/sequences.js.map +1 -0
- package/dist/testing/env.d.ts +63 -0
- package/dist/testing/env.js +105 -0
- package/dist/testing/env.js.map +1 -0
- package/dist/testing/fake-chain.d.ts +118 -0
- package/dist/testing/fake-chain.js +536 -0
- package/dist/testing/fake-chain.js.map +1 -0
- package/dist/testing/fake-clock.d.ts +15 -0
- package/dist/testing/fake-clock.js +86 -0
- package/dist/testing/fake-clock.js.map +1 -0
- package/dist/testing/fake-driver.d.ts +15 -0
- package/dist/testing/fake-driver.js +458 -0
- package/dist/testing/fake-driver.js.map +1 -0
- package/dist/testing/fake-fetch.d.ts +32 -0
- package/dist/testing/fake-fetch.js +81 -0
- package/dist/testing/fake-fetch.js.map +1 -0
- package/dist/testing/fake-plugin.d.ts +30 -0
- package/dist/testing/fake-plugin.js +66 -0
- package/dist/testing/fake-plugin.js.map +1 -0
- package/dist/testing/faulty-store.d.ts +36 -0
- package/dist/testing/faulty-store.js +66 -0
- package/dist/testing/faulty-store.js.map +1 -0
- package/dist/testing/generation.d.ts +60 -0
- package/dist/testing/generation.js +252 -0
- package/dist/testing/generation.js.map +1 -0
- package/dist/testing/index.d.ts +28 -0
- package/dist/testing/index.js +51 -0
- package/dist/testing/index.js.map +1 -0
- package/package.json +188 -44
- package/dist/libs/eth/account.d.ts +0 -9
- package/dist/libs/eth/account.js +0 -58
- package/dist/libs/eth/account.js.map +0 -1
- package/dist/libs/eth/contract.d.ts +0 -2
- package/dist/libs/eth/contract.js +0 -7
- package/dist/libs/eth/contract.js.map +0 -1
- package/dist/libs/eth/index.d.ts +0 -20
- package/dist/libs/eth/index.js +0 -62
- package/dist/libs/eth/index.js.map +0 -1
- package/dist/libs/eth/transact.d.ts +0 -2
- package/dist/libs/eth/transact.js +0 -7
- package/dist/libs/eth/transact.js.map +0 -1
- package/dist/libs/index.d.ts +0 -1
- package/dist/libs/index.js +0 -18
- package/dist/libs/index.js.map +0 -1
- package/dist/tool/common.d.ts +0 -28
- package/dist/tool/common.js +0 -33
- package/dist/tool/common.js.map +0 -1
- package/dist/tool/eth-tools.d.ts +0 -3
- package/dist/tool/eth-tools.js +0 -33
- package/dist/tool/eth-tools.js.map +0 -1
- package/dist/tool/index.d.ts +0 -4
- package/dist/tool/index.js +0 -21
- package/dist/tool/index.js.map +0 -1
- package/dist/tool/logging.d.ts +0 -3
- package/dist/tool/logging.js +0 -11
- package/dist/tool/logging.js.map +0 -1
- package/dist/tool/options.d.ts +0 -4
- package/dist/tool/options.js +0 -28
- package/dist/tool/options.js.map +0 -1
- package/dist/type/account.d.ts +0 -9
- package/dist/type/account.js.map +0 -1
- package/dist/type/common.d.ts +0 -18
- package/dist/type/common.js.map +0 -1
- package/dist/type/index.d.ts +0 -3
- package/dist/type/index.js +0 -20
- package/dist/type/index.js.map +0 -1
- package/dist/type/lib-types.d.ts +0 -7
- package/dist/type/lib-types.js.map +0 -1
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** The bytes of a canonical base58 string of `length` bytes, or `null`. */
|
|
2
|
+
export declare function decodeBase58(value: unknown, length: number): Uint8Array | null;
|
|
3
|
+
export declare const encodeBase58: (bytes: Uint8Array) => string;
|
|
4
|
+
/** A 32-byte account address (on or off the ed25519 curve: PDAs are addresses too). */
|
|
5
|
+
export declare const isAddress: (value: unknown) => value is string;
|
|
6
|
+
/** A 64-byte transaction signature. */
|
|
7
|
+
export declare const isSignature: (value: unknown) => value is string;
|
|
8
|
+
/**
|
|
9
|
+
* The address of a wallet's ed25519 public key: exactly 32 bytes that decode to a point on
|
|
10
|
+
* the curve and not of small order. Anything else (a 64-byte secret key, a 32-byte seed
|
|
11
|
+
* that is off the curve, the identity point) is refused with `INVALID_ADDRESS`.
|
|
12
|
+
*/
|
|
13
|
+
export declare function addressFromPublicKey(publicKey: Uint8Array): string;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isSignature = exports.isAddress = exports.encodeBase58 = void 0;
|
|
4
|
+
exports.decodeBase58 = decodeBase58;
|
|
5
|
+
exports.addressFromPublicKey = addressFromPublicKey;
|
|
6
|
+
/**
|
|
7
|
+
* Strict, SDK-free decoding of Solana keys and signatures. Only canonical
|
|
8
|
+
* base58 of exactly 32 (keys) or 64 (signatures) bytes is accepted, so the driver never
|
|
9
|
+
* relies on an SDK's leniency (`new PublicKey()` also takes numbers, arrays and BNs).
|
|
10
|
+
*/
|
|
11
|
+
const ed25519_1 = require("@noble/curves/ed25519");
|
|
12
|
+
const base_1 = require("@scure/base");
|
|
13
|
+
const error_1 = require("../../core/errors/error");
|
|
14
|
+
const ALPHABET = /^[1-9A-HJ-NP-Za-km-z]+$/;
|
|
15
|
+
/**
|
|
16
|
+
* The longest base58 text of `length` bytes: 44 characters for a key, 88 for a signature.
|
|
17
|
+
* base58 decoding is O(n²), so longer text is refused before it is decoded.
|
|
18
|
+
*/
|
|
19
|
+
const maxChars = (length) => Math.ceil((length * 8) / Math.log2(58));
|
|
20
|
+
/** The bytes of a canonical base58 string of `length` bytes, or `null`. */
|
|
21
|
+
function decodeBase58(value, length) {
|
|
22
|
+
if (typeof value !== 'string' || value.length === 0)
|
|
23
|
+
return null;
|
|
24
|
+
if (value.length > maxChars(length))
|
|
25
|
+
return null;
|
|
26
|
+
if (!ALPHABET.test(value))
|
|
27
|
+
return null;
|
|
28
|
+
let bytes;
|
|
29
|
+
try {
|
|
30
|
+
bytes = base_1.base58.decode(value);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
// Canonical: exactly `length` bytes, and re-encoding gives the same text back.
|
|
36
|
+
if (bytes.length !== length || base_1.base58.encode(bytes) !== value)
|
|
37
|
+
return null;
|
|
38
|
+
return bytes;
|
|
39
|
+
}
|
|
40
|
+
const encodeBase58 = (bytes) => base_1.base58.encode(bytes);
|
|
41
|
+
exports.encodeBase58 = encodeBase58;
|
|
42
|
+
/** A 32-byte account address (on or off the ed25519 curve: PDAs are addresses too). */
|
|
43
|
+
const isAddress = (value) => decodeBase58(value, 32) !== null;
|
|
44
|
+
exports.isAddress = isAddress;
|
|
45
|
+
/** A 64-byte transaction signature. */
|
|
46
|
+
const isSignature = (value) => decodeBase58(value, 64) !== null;
|
|
47
|
+
exports.isSignature = isSignature;
|
|
48
|
+
/**
|
|
49
|
+
* The address of a wallet's ed25519 public key: exactly 32 bytes that decode to a point on
|
|
50
|
+
* the curve and not of small order. Anything else (a 64-byte secret key, a 32-byte seed
|
|
51
|
+
* that is off the curve, the identity point) is refused with `INVALID_ADDRESS`.
|
|
52
|
+
*/
|
|
53
|
+
function addressFromPublicKey(publicKey) {
|
|
54
|
+
if (!(publicKey instanceof Uint8Array) || publicKey.length !== 32) {
|
|
55
|
+
throw new error_1.ValidationError('INVALID_ADDRESS', 'a Solana public key is exactly 32 bytes');
|
|
56
|
+
}
|
|
57
|
+
let point;
|
|
58
|
+
try {
|
|
59
|
+
point = ed25519_1.ed25519.ExtendedPoint.fromHex(publicKey);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
throw new error_1.ValidationError('INVALID_ADDRESS', 'the public key is not a point on the ed25519 curve');
|
|
63
|
+
}
|
|
64
|
+
if (point.isSmallOrder()) {
|
|
65
|
+
throw new error_1.ValidationError('INVALID_ADDRESS', 'the public key has small order');
|
|
66
|
+
}
|
|
67
|
+
return base_1.base58.encode(publicKey);
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../src/adapters/solana/keys.ts"],"names":[],"mappings":";;;AAkBA,oCAaC;AAiBD,oDAoBC;AApED;;;;GAIG;AACH,mDAAgD;AAChD,sCAAqC;AACrC,mDAA0D;AAE1D,MAAM,QAAQ,GAAG,yBAAyB,CAAC;AAE3C;;;GAGG;AACH,MAAM,QAAQ,GAAG,CAAC,MAAc,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AAErF,2EAA2E;AAC3E,SAAgB,YAAY,CAAC,KAAc,EAAE,MAAc;IACzD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACjE,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,IAAI,KAAiB,CAAC;IACtB,IAAI,CAAC;QACH,KAAK,GAAG,aAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,+EAA+E;IAC/E,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,aAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAC3E,OAAO,KAAK,CAAC;AACf,CAAC;AAEM,MAAM,YAAY,GAAG,CAAC,KAAiB,EAAU,EAAE,CAAC,aAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAAnE,QAAA,YAAY,gBAAuD;AAEhF,uFAAuF;AAChF,MAAM,SAAS,GAAG,CAAC,KAAc,EAAmB,EAAE,CAC3D,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC;AADtB,QAAA,SAAS,aACa;AAEnC,uCAAuC;AAChC,MAAM,WAAW,GAAG,CAAC,KAAc,EAAmB,EAAE,CAC7D,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC;AADtB,QAAA,WAAW,eACW;AAEnC;;;;GAIG;AACH,SAAgB,oBAAoB,CAAC,SAAqB;IACxD,IAAI,CAAC,CAAC,SAAS,YAAY,UAAU,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QAClE,MAAM,IAAI,uBAAe,CACvB,iBAAiB,EACjB,yCAAyC,CAC1C,CAAC;IACJ,CAAC;IACD,IAAI,KAAuD,CAAC;IAC5D,IAAI,CAAC;QACH,KAAK,GAAG,iBAAO,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,uBAAe,CACvB,iBAAiB,EACjB,oDAAoD,CACrD,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,YAAY,EAAE,EAAE,CAAC;QACzB,MAAM,IAAI,uBAAe,CAAC,iBAAiB,EAAE,gCAAgC,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,aAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC","sourcesContent":["/**\n * Strict, SDK-free decoding of Solana keys and signatures. Only canonical\n * base58 of exactly 32 (keys) or 64 (signatures) bytes is accepted, so the driver never\n * relies on an SDK's leniency (`new PublicKey()` also takes numbers, arrays and BNs).\n */\nimport { ed25519 } from '@noble/curves/ed25519';\nimport { base58 } from '@scure/base';\nimport { ValidationError } from '../../core/errors/error';\n\nconst ALPHABET = /^[1-9A-HJ-NP-Za-km-z]+$/;\n\n/**\n * The longest base58 text of `length` bytes: 44 characters for a key, 88 for a signature.\n * base58 decoding is O(n²), so longer text is refused before it is decoded.\n */\nconst maxChars = (length: number): number => Math.ceil((length * 8) / Math.log2(58));\n\n/** The bytes of a canonical base58 string of `length` bytes, or `null`. */\nexport function decodeBase58(value: unknown, length: number): Uint8Array | null {\n if (typeof value !== 'string' || value.length === 0) return null;\n if (value.length > maxChars(length)) return null;\n if (!ALPHABET.test(value)) return null;\n let bytes: Uint8Array;\n try {\n bytes = base58.decode(value);\n } catch {\n return null;\n }\n // Canonical: exactly `length` bytes, and re-encoding gives the same text back.\n if (bytes.length !== length || base58.encode(bytes) !== value) return null;\n return bytes;\n}\n\nexport const encodeBase58 = (bytes: Uint8Array): string => base58.encode(bytes);\n\n/** A 32-byte account address (on or off the ed25519 curve: PDAs are addresses too). */\nexport const isAddress = (value: unknown): value is string =>\n decodeBase58(value, 32) !== null;\n\n/** A 64-byte transaction signature. */\nexport const isSignature = (value: unknown): value is string =>\n decodeBase58(value, 64) !== null;\n\n/**\n * The address of a wallet's ed25519 public key: exactly 32 bytes that decode to a point on\n * the curve and not of small order. Anything else (a 64-byte secret key, a 32-byte seed\n * that is off the curve, the identity point) is refused with `INVALID_ADDRESS`.\n */\nexport function addressFromPublicKey(publicKey: Uint8Array): string {\n if (!(publicKey instanceof Uint8Array) || publicKey.length !== 32) {\n throw new ValidationError(\n 'INVALID_ADDRESS',\n 'a Solana public key is exactly 32 bytes',\n );\n }\n let point: ReturnType<typeof ed25519.ExtendedPoint.fromHex>;\n try {\n point = ed25519.ExtendedPoint.fromHex(publicKey);\n } catch {\n throw new ValidationError(\n 'INVALID_ADDRESS',\n 'the public key is not a point on the ed25519 curve',\n );\n }\n if (point.isSmallOrder()) {\n throw new ValidationError('INVALID_ADDRESS', 'the public key has small order');\n }\n return base58.encode(publicKey);\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Capability } from '../../core/model/capability';
|
|
2
|
+
import type { ChainInfo, NetworkInfo } from '../../core/model/chain';
|
|
3
|
+
/** Every capability a Solana network has; a network may remove some. */
|
|
4
|
+
export declare const SOLANA_CAPABILITIES: readonly Capability[];
|
|
5
|
+
/**
|
|
6
|
+
* The highest compute-unit price a transfer signs unless the handle's `maxComputeUnitPrice`
|
|
7
|
+
* option allows more: 10,000,000 micro-lamports per compute unit. A speed's
|
|
8
|
+
* price comes from one endpoint's `getRecentPrioritizationFees` and its limit from one
|
|
9
|
+
* endpoint's simulation (up to 1,400,000 units), so this operator bound is the only one no
|
|
10
|
+
* node can raise. At the largest limit it caps a transfer's priority fee at 14,000,000
|
|
11
|
+
* lamports (0.014 SOL).
|
|
12
|
+
*/
|
|
13
|
+
export declare const DEFAULT_MAX_COMPUTE_UNIT_PRICE = 10000000n;
|
|
14
|
+
export interface SolanaNetworkConfig {
|
|
15
|
+
/** The genesis hash every endpoint must report (`getGenesisHash`). */
|
|
16
|
+
readonly genesisHash: string;
|
|
17
|
+
readonly capabilities: ReadonlySet<Capability>;
|
|
18
|
+
/**
|
|
19
|
+
* The largest compute-unit price a transfer signs, in micro-lamports per compute unit:
|
|
20
|
+
* from 999 (the largest build variant, which a speed keeps at the bound) to 2^64 − 1.
|
|
21
|
+
*/
|
|
22
|
+
readonly maxComputeUnitPrice: bigint;
|
|
23
|
+
}
|
|
24
|
+
export declare function solanaNetworkConfig(chain: ChainInfo, network: NetworkInfo, options?: Readonly<Record<string, unknown>>): SolanaNetworkConfig;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_MAX_COMPUTE_UNIT_PRICE = exports.SOLANA_CAPABILITIES = void 0;
|
|
4
|
+
exports.solanaNetworkConfig = solanaNetworkConfig;
|
|
5
|
+
/**
|
|
6
|
+
* What the Solana driver needs from a network's registry entry and the handle's options,
|
|
7
|
+
* validated once when a driver is created, so inconsistent data or an unknown option fails
|
|
8
|
+
* with `CONFIG_INVALID` instead of misbehaving.
|
|
9
|
+
*/
|
|
10
|
+
const error_1 = require("../../core/errors/error");
|
|
11
|
+
const names_1 = require("../../core/util/names");
|
|
12
|
+
const fees_1 = require("./fees");
|
|
13
|
+
const keys_1 = require("./keys");
|
|
14
|
+
/** Every capability a Solana network has; a network may remove some. */
|
|
15
|
+
exports.SOLANA_CAPABILITIES = Object.freeze([
|
|
16
|
+
'tokens',
|
|
17
|
+
'memo',
|
|
18
|
+
'block-scan',
|
|
19
|
+
'address-history',
|
|
20
|
+
'expiry',
|
|
21
|
+
]);
|
|
22
|
+
/**
|
|
23
|
+
* The highest compute-unit price a transfer signs unless the handle's `maxComputeUnitPrice`
|
|
24
|
+
* option allows more: 10,000,000 micro-lamports per compute unit. A speed's
|
|
25
|
+
* price comes from one endpoint's `getRecentPrioritizationFees` and its limit from one
|
|
26
|
+
* endpoint's simulation (up to 1,400,000 units), so this operator bound is the only one no
|
|
27
|
+
* node can raise. At the largest limit it caps a transfer's priority fee at 14,000,000
|
|
28
|
+
* lamports (0.014 SOL).
|
|
29
|
+
*/
|
|
30
|
+
exports.DEFAULT_MAX_COMPUTE_UNIT_PRICE = 10000000n;
|
|
31
|
+
const U64_MAX = 2n ** 64n - 1n;
|
|
32
|
+
/**
|
|
33
|
+
* The only driver option (`HandleOptions.options`) the Solana driver reads. Any other key is
|
|
34
|
+
* refused, so a typo, or another family's option such as Tron's `maxFeeLimit`, fails loudly
|
|
35
|
+
* instead of leaving the default in place.
|
|
36
|
+
*/
|
|
37
|
+
const OPTION_KEYS = Object.freeze(['maxComputeUnitPrice']);
|
|
38
|
+
/** A price bound: a bigint of micro-lamports per compute unit that leaves room for a variant. */
|
|
39
|
+
function priceBound(value, name, fail) {
|
|
40
|
+
if (typeof value !== 'bigint' || value < fees_1.MAX_PRICE_VARIANT || value > U64_MAX) {
|
|
41
|
+
fail(`${name} must be a bigint of micro-lamports per compute unit from 999 to 2^64 − 1`);
|
|
42
|
+
}
|
|
43
|
+
return value;
|
|
44
|
+
}
|
|
45
|
+
function solanaNetworkConfig(chain, network, options = {}) {
|
|
46
|
+
const fail = (reason) => {
|
|
47
|
+
throw new error_1.ConfigError('CONFIG_INVALID', `Solana network ${chain.id}:${network.id}: ${reason}`);
|
|
48
|
+
};
|
|
49
|
+
if (chain.model !== 'account' || chain.ordering !== 'expiry') {
|
|
50
|
+
fail('the chain must use the account model and expiry ordering');
|
|
51
|
+
}
|
|
52
|
+
if (chain.schemes.length !== 1 || chain.schemes[0] !== 'ed25519') {
|
|
53
|
+
fail(`its only scheme must be 'ed25519'`);
|
|
54
|
+
}
|
|
55
|
+
if (chain.nativeAsset.decimals !== 9)
|
|
56
|
+
fail('the native asset has 9 decimals (lamports)');
|
|
57
|
+
if ((0, keys_1.decodeBase58)(network.identity, 32) === null) {
|
|
58
|
+
fail('its identity must be the base58 genesis hash');
|
|
59
|
+
}
|
|
60
|
+
if (network.feeModel !== 'solana')
|
|
61
|
+
fail(`its fee model must be 'solana'`);
|
|
62
|
+
const { finality } = network;
|
|
63
|
+
if (finality.kind !== 'commitment' || finality.level !== 'finalized') {
|
|
64
|
+
fail(`its finality must be the 'finalized' commitment`);
|
|
65
|
+
}
|
|
66
|
+
if (network.replacement !== undefined)
|
|
67
|
+
fail('Solana has no replace or cancel');
|
|
68
|
+
const capabilities = new Set(exports.SOLANA_CAPABILITIES);
|
|
69
|
+
for (const c of network.capabilities?.add ?? [])
|
|
70
|
+
capabilities.add(c);
|
|
71
|
+
for (const c of network.capabilities?.remove ?? [])
|
|
72
|
+
capabilities.delete(c);
|
|
73
|
+
for (const c of ['replace-fee', 'cancel', 'batch-transfer']) {
|
|
74
|
+
if (capabilities.has(c))
|
|
75
|
+
fail(`the Solana driver cannot offer '${c}'`);
|
|
76
|
+
}
|
|
77
|
+
if (!capabilities.has('expiry'))
|
|
78
|
+
fail(`'expiry' is how Solana orders transactions`);
|
|
79
|
+
// The refusal lists the accepted name and shows neither the caller's key, which
|
|
80
|
+
// may be a pasted secret, nor its value.
|
|
81
|
+
for (const key of Object.keys(options)) {
|
|
82
|
+
if (!OPTION_KEYS.includes(key)) {
|
|
83
|
+
fail((0, names_1.unknownName)('option', OPTION_KEYS));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// The handle's option, else the network entry's own, else the default. A network value
|
|
87
|
+
// is checked even where an option overrides it.
|
|
88
|
+
const own = network.params?.maxComputeUnitPrice;
|
|
89
|
+
const networkBound = own === undefined ? undefined : priceBound(own, 'params.maxComputeUnitPrice', fail);
|
|
90
|
+
const maxComputeUnitPrice = options.maxComputeUnitPrice !== undefined
|
|
91
|
+
? priceBound(options.maxComputeUnitPrice, 'maxComputeUnitPrice', fail)
|
|
92
|
+
: (networkBound ?? exports.DEFAULT_MAX_COMPUTE_UNIT_PRICE);
|
|
93
|
+
return { genesisHash: network.identity, capabilities, maxComputeUnitPrice };
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=network.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../../src/adapters/solana/network.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * What the Solana driver needs from a network's registry entry and the handle's options,\n * validated once when a driver is created, so inconsistent data or an unknown option fails\n * with `CONFIG_INVALID` instead of misbehaving.\n */\nimport { ConfigError } from '../../core/errors/error';\nimport type { Capability } from '../../core/model/capability';\nimport type { ChainInfo, NetworkInfo } from '../../core/model/chain';\nimport { unknownName } from '../../core/util/names';\nimport { MAX_PRICE_VARIANT } from './fees';\nimport { decodeBase58 } from './keys';\n\n/** Every capability a Solana network has; a network may remove some. */\nexport const SOLANA_CAPABILITIES: readonly Capability[] = Object.freeze([\n 'tokens',\n 'memo',\n 'block-scan',\n 'address-history',\n 'expiry',\n]);\n\n/**\n * The highest compute-unit price a transfer signs unless the handle's `maxComputeUnitPrice`\n * option allows more: 10,000,000 micro-lamports per compute unit. A speed's\n * price comes from one endpoint's `getRecentPrioritizationFees` and its limit from one\n * endpoint's simulation (up to 1,400,000 units), so this operator bound is the only one no\n * node can raise. At the largest limit it caps a transfer's priority fee at 14,000,000\n * lamports (0.014 SOL).\n */\nexport const DEFAULT_MAX_COMPUTE_UNIT_PRICE = 10_000_000n;\nconst U64_MAX = 2n ** 64n - 1n;\n\nexport interface SolanaNetworkConfig {\n /** The genesis hash every endpoint must report (`getGenesisHash`). */\n readonly genesisHash: string;\n readonly capabilities: ReadonlySet<Capability>;\n /**\n * The largest compute-unit price a transfer signs, in micro-lamports per compute unit:\n * from 999 (the largest build variant, which a speed keeps at the bound) to 2^64 − 1.\n */\n readonly maxComputeUnitPrice: bigint;\n}\n\n/**\n * The only driver option (`HandleOptions.options`) the Solana driver reads. Any other key is\n * refused, so a typo, or another family's option such as Tron's `maxFeeLimit`, fails loudly\n * instead of leaving the default in place.\n */\nconst OPTION_KEYS: readonly string[] = Object.freeze(['maxComputeUnitPrice']);\n\n/** A price bound: a bigint of micro-lamports per compute unit that leaves room for a variant. */\nfunction priceBound(\n value: unknown,\n name: string,\n fail: (reason: string) => never,\n): bigint {\n if (typeof value !== 'bigint' || value < MAX_PRICE_VARIANT || value > U64_MAX) {\n fail(\n `${name} must be a bigint of micro-lamports per compute unit from 999 to 2^64 − 1`,\n );\n }\n return value as bigint;\n}\n\nexport function solanaNetworkConfig(\n chain: ChainInfo,\n network: NetworkInfo,\n options: Readonly<Record<string, unknown>> = {},\n): SolanaNetworkConfig {\n const fail = (reason: string): never => {\n throw new ConfigError(\n 'CONFIG_INVALID',\n `Solana network ${chain.id}:${network.id}: ${reason}`,\n );\n };\n if (chain.model !== 'account' || chain.ordering !== 'expiry') {\n fail('the chain must use the account model and expiry ordering');\n }\n if (chain.schemes.length !== 1 || chain.schemes[0] !== 'ed25519') {\n fail(`its only scheme must be 'ed25519'`);\n }\n if (chain.nativeAsset.decimals !== 9)\n fail('the native asset has 9 decimals (lamports)');\n if (decodeBase58(network.identity, 32) === null) {\n fail('its identity must be the base58 genesis hash');\n }\n if (network.feeModel !== 'solana') fail(`its fee model must be 'solana'`);\n const { finality } = network;\n if (finality.kind !== 'commitment' || finality.level !== 'finalized') {\n fail(`its finality must be the 'finalized' commitment`);\n }\n if (network.replacement !== undefined) fail('Solana has no replace or cancel');\n const capabilities = new Set<Capability>(SOLANA_CAPABILITIES);\n for (const c of network.capabilities?.add ?? []) capabilities.add(c);\n for (const c of network.capabilities?.remove ?? []) capabilities.delete(c);\n for (const c of ['replace-fee', 'cancel', 'batch-transfer'] as const) {\n if (capabilities.has(c)) fail(`the Solana driver cannot offer '${c}'`);\n }\n if (!capabilities.has('expiry')) fail(`'expiry' is how Solana orders transactions`);\n // The refusal lists the accepted name and shows neither the caller's key, which\n // may be a pasted secret, nor its value.\n for (const key of Object.keys(options)) {\n if (!OPTION_KEYS.includes(key)) {\n fail(unknownName('option', OPTION_KEYS));\n }\n }\n // The handle's option, else the network entry's own, else the default. A network value\n // is checked even where an option overrides it.\n const own = network.params?.maxComputeUnitPrice;\n const networkBound =\n own === undefined ? undefined : priceBound(own, 'params.maxComputeUnitPrice', fail);\n const maxComputeUnitPrice =\n options.maxComputeUnitPrice !== undefined\n ? priceBound(options.maxComputeUnitPrice, 'maxComputeUnitPrice', fail)\n : (networkBound ?? DEFAULT_MAX_COMPUTE_UNIT_PRICE);\n return { genesisHash: network.identity as string, capabilities, maxComputeUnitPrice };\n}\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Solana family plugin: the chain, tokens and provider presets as data, plus
|
|
3
|
+
* one adapter manifest. SDK-free: only the manifest's `load()` requires the `@solana/web3.js`
|
|
4
|
+
* module, and with it the SDK.
|
|
5
|
+
*/
|
|
6
|
+
import type { AdapterManifest, PeerDependency } from '../../core/driver/types';
|
|
7
|
+
import type { Plugin } from '../../core/registry/plugin';
|
|
8
|
+
/** The SDK versions this adapter is validated against, keyed by library. */
|
|
9
|
+
export declare const SOLANA_PEER_DEPENDENCIES: Readonly<Record<'@solana/web3.js', PeerDependency>>;
|
|
10
|
+
/**
|
|
11
|
+
* The `@solana/web3.js` manifest, built once, at module level, like the presets. Plugins
|
|
12
|
+
* compare functions by identity, so every `solanaPlugin()` carries the same `load`
|
|
13
|
+
* function and registering it again is the same plugin, not a conflicting one
|
|
14
|
+
* (`CONFIG_INVALID`).
|
|
15
|
+
*/
|
|
16
|
+
export declare const solanaManifest: AdapterManifest;
|
|
17
|
+
/** The built-in Solana family: mainnet, devnet and testnet. */
|
|
18
|
+
export declare function solanaPlugin(): Plugin;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.solanaManifest = exports.SOLANA_PEER_DEPENDENCIES = void 0;
|
|
4
|
+
exports.solanaPlugin = solanaPlugin;
|
|
5
|
+
const chains_1 = require("./chains");
|
|
6
|
+
const network_1 = require("./network");
|
|
7
|
+
const presets_1 = require("./presets");
|
|
8
|
+
const tokens_1 = require("./tokens");
|
|
9
|
+
/** The SDK versions this adapter is validated against, keyed by library. */
|
|
10
|
+
exports.SOLANA_PEER_DEPENDENCIES = Object.freeze({
|
|
11
|
+
'@solana/web3.js': Object.freeze({ name: '@solana/web3.js', range: '^1.99.0' }),
|
|
12
|
+
});
|
|
13
|
+
/**
|
|
14
|
+
* The `@solana/web3.js` manifest, built once, at module level, like the presets. Plugins
|
|
15
|
+
* compare functions by identity, so every `solanaPlugin()` carries the same `load`
|
|
16
|
+
* function and registering it again is the same plugin, not a conflicting one
|
|
17
|
+
* (`CONFIG_INVALID`).
|
|
18
|
+
*/
|
|
19
|
+
exports.solanaManifest = Object.freeze({
|
|
20
|
+
family: 'solana',
|
|
21
|
+
library: '@solana/web3.js',
|
|
22
|
+
chains: Object.freeze(['solana']),
|
|
23
|
+
capabilities: network_1.SOLANA_CAPABILITIES,
|
|
24
|
+
peerDependencies: Object.freeze([exports.SOLANA_PEER_DEPENDENCIES['@solana/web3.js']]),
|
|
25
|
+
load: async () => {
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
27
|
+
const mod = require('./web3');
|
|
28
|
+
return mod.web3DriverFactory;
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
/** The built-in Solana family: mainnet, devnet and testnet. */
|
|
32
|
+
function solanaPlugin() {
|
|
33
|
+
return {
|
|
34
|
+
name: 'solana',
|
|
35
|
+
chains: [chains_1.SOLANA_CHAIN],
|
|
36
|
+
adapters: [exports.solanaManifest],
|
|
37
|
+
presets: presets_1.SOLANA_PRESETS,
|
|
38
|
+
assets: tokens_1.SOLANA_TOKENS,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/adapters/solana/plugin.ts"],"names":[],"mappings":";;;AA2CA,oCAQC;AAxCD,qCAAwC;AACxC,uCAAgD;AAChD,uCAA2C;AAC3C,qCAAyC;AAEzC,4EAA4E;AAC/D,QAAA,wBAAwB,GAEjC,MAAM,CAAC,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;CAChF,CAAC,CAAC;AAEH;;;;;GAKG;AACU,QAAA,cAAc,GAAoB,MAAM,CAAC,MAAM,CAAC;IAC3D,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,iBAAiB;IAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;IACjC,YAAY,EAAE,6BAAmB;IACjC,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,gCAAwB,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC9E,IAAI,EAAE,KAAK,IAA4B,EAAE;QACvC,iEAAiE;QACjE,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAA4B,CAAC;QACzD,OAAO,GAAG,CAAC,iBAAiB,CAAC;IAC/B,CAAC;CACF,CAAC,CAAC;AAEH,+DAA+D;AAC/D,SAAgB,YAAY;IAC1B,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,CAAC,qBAAY,CAAC;QACtB,QAAQ,EAAE,CAAC,sBAAc,CAAC;QAC1B,OAAO,EAAE,wBAAc;QACvB,MAAM,EAAE,sBAAa;KACtB,CAAC;AACJ,CAAC","sourcesContent":["/**\n * The Solana family plugin: the chain, tokens and provider presets as data, plus\n * one adapter manifest. SDK-free: only the manifest's `load()` requires the `@solana/web3.js`\n * module, and with it the SDK.\n */\nimport type {\n AdapterManifest,\n DriverFactory,\n PeerDependency,\n} from '../../core/driver/types';\nimport type { Plugin } from '../../core/registry/plugin';\nimport { SOLANA_CHAIN } from './chains';\nimport { SOLANA_CAPABILITIES } from './network';\nimport { SOLANA_PRESETS } from './presets';\nimport { SOLANA_TOKENS } from './tokens';\n\n/** The SDK versions this adapter is validated against, keyed by library. */\nexport const SOLANA_PEER_DEPENDENCIES: Readonly<\n Record<'@solana/web3.js', PeerDependency>\n> = Object.freeze({\n '@solana/web3.js': Object.freeze({ name: '@solana/web3.js', range: '^1.99.0' }),\n});\n\n/**\n * The `@solana/web3.js` manifest, built once, at module level, like the presets. Plugins\n * compare functions by identity, so every `solanaPlugin()` carries the same `load`\n * function and registering it again is the same plugin, not a conflicting one\n * (`CONFIG_INVALID`).\n */\nexport const solanaManifest: AdapterManifest = Object.freeze({\n family: 'solana',\n library: '@solana/web3.js',\n chains: Object.freeze(['solana']),\n capabilities: SOLANA_CAPABILITIES,\n peerDependencies: Object.freeze([SOLANA_PEER_DEPENDENCIES['@solana/web3.js']]),\n load: async (): Promise<DriverFactory> => {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const mod = require('./web3') as typeof import('./web3');\n return mod.web3DriverFactory;\n },\n});\n\n/** The built-in Solana family: mainnet, devnet and testnet. */\nexport function solanaPlugin(): Plugin {\n return {\n name: 'solana',\n chains: [SOLANA_CHAIN],\n adapters: [solanaManifest],\n presets: SOLANA_PRESETS,\n assets: SOLANA_TOKENS,\n };\n}\n"]}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SOLANA_PRESETS = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Solana provider presets. Only URL templates verified against the provider's own
|
|
6
|
+
* documentation are listed; a preset refuses every other cluster with `CONFIG_INVALID`.
|
|
7
|
+
* Keyed URLs are `Secret`s, so the key never reaches logs or errors.
|
|
8
|
+
*/
|
|
9
|
+
const error_1 = require("../../core/errors/error");
|
|
10
|
+
const secret_1 = require("../../core/secret/secret");
|
|
11
|
+
const freeze_1 = require("../../core/util/freeze");
|
|
12
|
+
/** The rate-limited public endpoints the Solana documentation lists (not for production). */
|
|
13
|
+
const PUBLIC = {
|
|
14
|
+
mainnet: 'https://api.mainnet.solana.com',
|
|
15
|
+
devnet: 'https://api.devnet.solana.com',
|
|
16
|
+
testnet: 'https://api.testnet.solana.com',
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* The public RPC's published per-IP limits: 100 requests per 10 s, 40 per 10 s for a
|
|
20
|
+
* single method, 40 concurrent connections, so 4 rps. The transport's bucket is per
|
|
21
|
+
* endpoint, not per method, and the published per-method figure does not hold for
|
|
22
|
+
* `getBlock`: devnet and testnet answered HTTP 429 (`Retry-After: 10`) after about 6
|
|
23
|
+
* `getBlock` calls per 10 s in September 2026. This rate does not keep a block scan or a
|
|
24
|
+
* window proof under that; a scan waits out each 429 and falls behind, and a window proof
|
|
25
|
+
* completes over many passes. The preset still keeps the published rate: a keyless preset
|
|
26
|
+
* sets only a rate its operator publishes, since a guessed one throttles for nothing or
|
|
27
|
+
* protects nothing.
|
|
28
|
+
*/
|
|
29
|
+
const PUBLIC_RPS = 4;
|
|
30
|
+
/** `https://<host>.g.alchemy.com/v2/<key>`. */
|
|
31
|
+
const ALCHEMY = { mainnet: 'solana-mainnet', devnet: 'solana-devnet' };
|
|
32
|
+
/** `https://<host>.infura.io/v3/<key>`. */
|
|
33
|
+
const INFURA = { mainnet: 'solana-mainnet', devnet: 'solana-devnet' };
|
|
34
|
+
/** `https://rpc.ankr.com/<path>/<key>`. */
|
|
35
|
+
const ANKR = { mainnet: 'solana', devnet: 'solana_devnet' };
|
|
36
|
+
const supports = (table) => (chain, network) => chain === 'solana' && Object.hasOwn(table, network);
|
|
37
|
+
function entry(table, input) {
|
|
38
|
+
const value = Object.hasOwn(table, input.network) ? table[input.network] : undefined;
|
|
39
|
+
// Unreachable through the catalog, which asks `supports` first.
|
|
40
|
+
if (value === undefined)
|
|
41
|
+
throw new Error(`no entry for ${input.chain}:${input.network}`);
|
|
42
|
+
return value;
|
|
43
|
+
}
|
|
44
|
+
/** The revealed key; the error names the preset and network, never the key. */
|
|
45
|
+
function apiKeyOf(name, input) {
|
|
46
|
+
const key = input.apiKey === undefined ? undefined : (0, secret_1.reveal)(input.apiKey);
|
|
47
|
+
if (typeof key !== 'string' || key.trim() === '') {
|
|
48
|
+
throw new error_1.ConfigError('CONFIG_INVALID', `provider preset '${name}' requires a non-empty apiKey for ${input.chain}:${input.network}`);
|
|
49
|
+
}
|
|
50
|
+
return key;
|
|
51
|
+
}
|
|
52
|
+
function keyed(name, table, url) {
|
|
53
|
+
return {
|
|
54
|
+
name,
|
|
55
|
+
kind: 'rpc',
|
|
56
|
+
requiresApiKey: true,
|
|
57
|
+
supports: supports(table),
|
|
58
|
+
endpoints: (input) => [
|
|
59
|
+
{ name, url: (0, secret_1.secret)(url(entry(table, input), apiKeyOf(name, input))) },
|
|
60
|
+
],
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
exports.SOLANA_PRESETS = (0, freeze_1.deepFreeze)([
|
|
64
|
+
{
|
|
65
|
+
name: 'public',
|
|
66
|
+
kind: 'rpc',
|
|
67
|
+
production: false,
|
|
68
|
+
supports: supports(PUBLIC),
|
|
69
|
+
endpoints: (input) => [
|
|
70
|
+
{ name: 'public', url: entry(PUBLIC, input), rateLimit: { rps: PUBLIC_RPS } },
|
|
71
|
+
],
|
|
72
|
+
},
|
|
73
|
+
keyed('alchemy', ALCHEMY, (host, key) => `https://${host}.g.alchemy.com/v2/${key}`),
|
|
74
|
+
keyed('infura', INFURA, (host, key) => `https://${host}.infura.io/v3/${key}`),
|
|
75
|
+
keyed('ankr', ANKR, (path, key) => `https://rpc.ankr.com/${path}/${key}`),
|
|
76
|
+
]);
|
|
77
|
+
//# sourceMappingURL=presets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets.js","sourceRoot":"","sources":["../../../src/adapters/solana/presets.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Solana provider presets. Only URL templates verified against the provider's own\n * documentation are listed; a preset refuses every other cluster with `CONFIG_INVALID`.\n * Keyed URLs are `Secret`s, so the key never reaches logs or errors.\n */\nimport { ConfigError } from '../../core/errors/error';\nimport type { PresetInput, ProviderPreset } from '../../core/registry/providers';\nimport { reveal, secret } from '../../core/secret/secret';\nimport type { EndpointConfig } from '../../core/transport/types';\nimport { deepFreeze } from '../../core/util/freeze';\n\ntype Table = Readonly<Record<string, string>>;\n\n/** The rate-limited public endpoints the Solana documentation lists (not for production). */\nconst PUBLIC: Table = {\n mainnet: 'https://api.mainnet.solana.com',\n devnet: 'https://api.devnet.solana.com',\n testnet: 'https://api.testnet.solana.com',\n};\n\n/**\n * The public RPC's published per-IP limits: 100 requests per 10 s, 40 per 10 s for a\n * single method, 40 concurrent connections, so 4 rps. The transport's bucket is per\n * endpoint, not per method, and the published per-method figure does not hold for\n * `getBlock`: devnet and testnet answered HTTP 429 (`Retry-After: 10`) after about 6\n * `getBlock` calls per 10 s in September 2026. This rate does not keep a block scan or a\n * window proof under that; a scan waits out each 429 and falls behind, and a window proof\n * completes over many passes. The preset still keeps the published rate: a keyless preset\n * sets only a rate its operator publishes, since a guessed one throttles for nothing or\n * protects nothing.\n */\nconst PUBLIC_RPS = 4;\n\n/** `https://<host>.g.alchemy.com/v2/<key>`. */\nconst ALCHEMY: Table = { mainnet: 'solana-mainnet', devnet: 'solana-devnet' };\n\n/** `https://<host>.infura.io/v3/<key>`. */\nconst INFURA: Table = { mainnet: 'solana-mainnet', devnet: 'solana-devnet' };\n\n/** `https://rpc.ankr.com/<path>/<key>`. */\nconst ANKR: Table = { mainnet: 'solana', devnet: 'solana_devnet' };\n\nconst supports =\n (table: Table) =>\n (chain: string, network: string): boolean =>\n chain === 'solana' && Object.hasOwn(table, network);\n\nfunction entry(table: Table, input: PresetInput): string {\n const value = Object.hasOwn(table, input.network) ? table[input.network] : undefined;\n // Unreachable through the catalog, which asks `supports` first.\n if (value === undefined)\n throw new Error(`no entry for ${input.chain}:${input.network}`);\n return value;\n}\n\n/** The revealed key; the error names the preset and network, never the key. */\nfunction apiKeyOf(name: string, input: PresetInput): string {\n const key: unknown = input.apiKey === undefined ? undefined : reveal(input.apiKey);\n if (typeof key !== 'string' || key.trim() === '') {\n throw new ConfigError(\n 'CONFIG_INVALID',\n `provider preset '${name}' requires a non-empty apiKey for ${input.chain}:${input.network}`,\n );\n }\n return key;\n}\n\nfunction keyed(\n name: string,\n table: Table,\n url: (value: string, key: string) => string,\n): ProviderPreset {\n return {\n name,\n kind: 'rpc',\n requiresApiKey: true,\n supports: supports(table),\n endpoints: (input): readonly EndpointConfig[] => [\n { name, url: secret(url(entry(table, input), apiKeyOf(name, input))) },\n ],\n };\n}\n\nexport const SOLANA_PRESETS: readonly ProviderPreset[] = deepFreeze([\n {\n name: 'public',\n kind: 'rpc',\n production: false,\n supports: supports(PUBLIC),\n endpoints: (input: PresetInput) => [\n { name: 'public', url: entry(PUBLIC, input), rateLimit: { rps: PUBLIC_RPS } },\n ],\n },\n keyed('alchemy', ALCHEMY, (host, key) => `https://${host}.g.alchemy.com/v2/${key}`),\n keyed('infura', INFURA, (host, key) => `https://${host}.infura.io/v3/${key}`),\n keyed('ankr', ANKR, (path, key) => `https://rpc.ankr.com/${path}/${key}`),\n]);\n"]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { SolanaInstruction } from './types';
|
|
2
|
+
export declare const SYSTEM_PROGRAM = "11111111111111111111111111111111";
|
|
3
|
+
export declare const TOKEN_PROGRAM = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";
|
|
4
|
+
export declare const TOKEN_2022_PROGRAM = "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb";
|
|
5
|
+
export declare const ASSOCIATED_TOKEN_PROGRAM = "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL";
|
|
6
|
+
export declare const MEMO_PROGRAM = "MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr";
|
|
7
|
+
/** The first Memo program; still parsed on received transactions. */
|
|
8
|
+
export declare const MEMO_V1_PROGRAM = "Memo1UhkJRfHyvLMcVucJwxXeuD728EqVDDwQDxFMNo";
|
|
9
|
+
export declare const COMPUTE_BUDGET_PROGRAM = "ComputeBudget111111111111111111111111111111";
|
|
10
|
+
export declare const VOTE_PROGRAM = "Vote111111111111111111111111111111111111111";
|
|
11
|
+
/** Classic Token program account sizes (bytes). */
|
|
12
|
+
export declare const MINT_SIZE = 82;
|
|
13
|
+
export declare const TOKEN_ACCOUNT_SIZE = 165;
|
|
14
|
+
/** A transaction's maximum serialized size (the network packet limit). */
|
|
15
|
+
export declare const MAX_TRANSACTION_SIZE = 1232;
|
|
16
|
+
/** The compute-unit limit of one transaction, and the default per instruction. */
|
|
17
|
+
export declare const MAX_COMPUTE_UNIT_LIMIT = 1400000n;
|
|
18
|
+
export declare const DEFAULT_INSTRUCTION_COMPUTE_UNITS = 200000n;
|
|
19
|
+
/** Memo text limit (UTF-8 bytes): a library policy that keeps every transfer well under
|
|
20
|
+
* the packet limit. */
|
|
21
|
+
export declare const MAX_MEMO_BYTES = 256;
|
|
22
|
+
/** ComputeBudget `SetComputeUnitLimit` (2, u32). */
|
|
23
|
+
export declare function setComputeUnitLimit(units: bigint): SolanaInstruction;
|
|
24
|
+
/** ComputeBudget `SetComputeUnitPrice` (3, u64 micro-lamports). */
|
|
25
|
+
export declare function setComputeUnitPrice(microLamports: bigint): SolanaInstruction;
|
|
26
|
+
/** System `Transfer` (2, u64 lamports). */
|
|
27
|
+
export declare function systemTransfer(from: string, to: string, lamports: bigint): SolanaInstruction;
|
|
28
|
+
/** Associated Token Account `CreateIdempotent` (1). */
|
|
29
|
+
export declare function createAssociatedTokenAccountIdempotent(payer: string, associated: string, owner: string, mint: string): SolanaInstruction;
|
|
30
|
+
/** Token `TransferChecked` (12, u64 amount, u8 decimals). */
|
|
31
|
+
export declare function transferChecked(source: string, mint: string, destination: string, authority: string, amount: bigint, decimals: number): SolanaInstruction;
|
|
32
|
+
/** Memo v2: the UTF-8 text, no accounts. */
|
|
33
|
+
export declare function memo(text: string): SolanaInstruction;
|
|
34
|
+
/** A classic Token mint (82 bytes): its decimals, when initialized. */
|
|
35
|
+
export declare function decodeMint(data: Uint8Array): {
|
|
36
|
+
readonly decimals: number;
|
|
37
|
+
} | null;
|
|
38
|
+
/** A classic Token account (165 bytes): mint, owner, amount and state. */
|
|
39
|
+
export declare function decodeTokenAccount(data: Uint8Array): {
|
|
40
|
+
readonly mint: Uint8Array;
|
|
41
|
+
readonly owner: Uint8Array;
|
|
42
|
+
readonly amount: bigint;
|
|
43
|
+
readonly frozen: boolean;
|
|
44
|
+
} | null;
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MAX_MEMO_BYTES = exports.DEFAULT_INSTRUCTION_COMPUTE_UNITS = exports.MAX_COMPUTE_UNIT_LIMIT = exports.MAX_TRANSACTION_SIZE = exports.TOKEN_ACCOUNT_SIZE = exports.MINT_SIZE = exports.VOTE_PROGRAM = exports.COMPUTE_BUDGET_PROGRAM = exports.MEMO_V1_PROGRAM = exports.MEMO_PROGRAM = exports.ASSOCIATED_TOKEN_PROGRAM = exports.TOKEN_2022_PROGRAM = exports.TOKEN_PROGRAM = exports.SYSTEM_PROGRAM = void 0;
|
|
4
|
+
exports.setComputeUnitLimit = setComputeUnitLimit;
|
|
5
|
+
exports.setComputeUnitPrice = setComputeUnitPrice;
|
|
6
|
+
exports.systemTransfer = systemTransfer;
|
|
7
|
+
exports.createAssociatedTokenAccountIdempotent = createAssociatedTokenAccountIdempotent;
|
|
8
|
+
exports.transferChecked = transferChecked;
|
|
9
|
+
exports.memo = memo;
|
|
10
|
+
exports.decodeMint = decodeMint;
|
|
11
|
+
exports.decodeTokenAccount = decodeTokenAccount;
|
|
12
|
+
/**
|
|
13
|
+
* Solana program ids, account layouts and the instructions the driver builds, SDK-free
|
|
14
|
+
* (built without `@solana/spl-token`). Every encoding is checked against a real devnet
|
|
15
|
+
* transaction and `@solana/web3.js`'s own builders (`codec.test.ts`).
|
|
16
|
+
*/
|
|
17
|
+
const error_1 = require("../../core/errors/error");
|
|
18
|
+
exports.SYSTEM_PROGRAM = '11111111111111111111111111111111';
|
|
19
|
+
exports.TOKEN_PROGRAM = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA';
|
|
20
|
+
exports.TOKEN_2022_PROGRAM = 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb';
|
|
21
|
+
exports.ASSOCIATED_TOKEN_PROGRAM = 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL';
|
|
22
|
+
exports.MEMO_PROGRAM = 'MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr';
|
|
23
|
+
/** The first Memo program; still parsed on received transactions. */
|
|
24
|
+
exports.MEMO_V1_PROGRAM = 'Memo1UhkJRfHyvLMcVucJwxXeuD728EqVDDwQDxFMNo';
|
|
25
|
+
exports.COMPUTE_BUDGET_PROGRAM = 'ComputeBudget111111111111111111111111111111';
|
|
26
|
+
exports.VOTE_PROGRAM = 'Vote111111111111111111111111111111111111111';
|
|
27
|
+
/** Classic Token program account sizes (bytes). */
|
|
28
|
+
exports.MINT_SIZE = 82;
|
|
29
|
+
exports.TOKEN_ACCOUNT_SIZE = 165;
|
|
30
|
+
/** A transaction's maximum serialized size (the network packet limit). */
|
|
31
|
+
exports.MAX_TRANSACTION_SIZE = 1232;
|
|
32
|
+
/** The compute-unit limit of one transaction, and the default per instruction. */
|
|
33
|
+
exports.MAX_COMPUTE_UNIT_LIMIT = 1400000n;
|
|
34
|
+
exports.DEFAULT_INSTRUCTION_COMPUTE_UNITS = 200000n;
|
|
35
|
+
/** Memo text limit (UTF-8 bytes): a library policy that keeps every transfer well under
|
|
36
|
+
* the packet limit. */
|
|
37
|
+
exports.MAX_MEMO_BYTES = 256;
|
|
38
|
+
/**
|
|
39
|
+
* DataView and `Uint8Array.of` silently wrap a value that does not fit (2^64 + 5 lamports
|
|
40
|
+
* would encode as 5); we refuse it with a fixed text: `INVALID_AMOUNT` for a u64
|
|
41
|
+
* (lamports, token amounts and micro-lamports), `INVALID_INTENT` for a u8 (decimals) or a
|
|
42
|
+
* u32 (compute units).
|
|
43
|
+
*/
|
|
44
|
+
const outOfRange = (bits) => new error_1.ValidationError(bits === 64 ? 'INVALID_AMOUNT' : 'INVALID_INTENT', `a value does not fit in its u${bits} field`);
|
|
45
|
+
function u8(value) {
|
|
46
|
+
if (!Number.isInteger(value) || value < 0 || value > 0xff)
|
|
47
|
+
throw outOfRange(8);
|
|
48
|
+
return Uint8Array.of(value);
|
|
49
|
+
}
|
|
50
|
+
function u32(value) {
|
|
51
|
+
if (value < 0n || value > 0xffffffffn)
|
|
52
|
+
throw outOfRange(32);
|
|
53
|
+
const out = new Uint8Array(4);
|
|
54
|
+
new DataView(out.buffer).setUint32(0, Number(value), true);
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
function u64(value) {
|
|
58
|
+
if (value < 0n || value >= 2n ** 64n)
|
|
59
|
+
throw outOfRange(64);
|
|
60
|
+
const out = new Uint8Array(8);
|
|
61
|
+
new DataView(out.buffer).setBigUint64(0, value, true);
|
|
62
|
+
return out;
|
|
63
|
+
}
|
|
64
|
+
const bytes = (...parts) => {
|
|
65
|
+
const out = new Uint8Array(parts.reduce((n, p) => n + p.length, 0));
|
|
66
|
+
let offset = 0;
|
|
67
|
+
for (const part of parts) {
|
|
68
|
+
out.set(part, offset);
|
|
69
|
+
offset += part.length;
|
|
70
|
+
}
|
|
71
|
+
return out;
|
|
72
|
+
};
|
|
73
|
+
const signer = (address, writable) => ({
|
|
74
|
+
address,
|
|
75
|
+
signer: true,
|
|
76
|
+
writable,
|
|
77
|
+
});
|
|
78
|
+
const account = (address, writable) => ({
|
|
79
|
+
address,
|
|
80
|
+
signer: false,
|
|
81
|
+
writable,
|
|
82
|
+
});
|
|
83
|
+
/** ComputeBudget `SetComputeUnitLimit` (2, u32). */
|
|
84
|
+
function setComputeUnitLimit(units) {
|
|
85
|
+
return {
|
|
86
|
+
programId: exports.COMPUTE_BUDGET_PROGRAM,
|
|
87
|
+
accounts: [],
|
|
88
|
+
data: bytes(Uint8Array.of(2), u32(units)),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/** ComputeBudget `SetComputeUnitPrice` (3, u64 micro-lamports). */
|
|
92
|
+
function setComputeUnitPrice(microLamports) {
|
|
93
|
+
return {
|
|
94
|
+
programId: exports.COMPUTE_BUDGET_PROGRAM,
|
|
95
|
+
accounts: [],
|
|
96
|
+
data: bytes(Uint8Array.of(3), u64(microLamports)),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/** System `Transfer` (2, u64 lamports). */
|
|
100
|
+
function systemTransfer(from, to, lamports) {
|
|
101
|
+
return {
|
|
102
|
+
programId: exports.SYSTEM_PROGRAM,
|
|
103
|
+
accounts: [signer(from, true), account(to, true)],
|
|
104
|
+
data: bytes(u32(2n), u64(lamports)),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/** Associated Token Account `CreateIdempotent` (1). */
|
|
108
|
+
function createAssociatedTokenAccountIdempotent(payer, associated, owner, mint) {
|
|
109
|
+
return {
|
|
110
|
+
programId: exports.ASSOCIATED_TOKEN_PROGRAM,
|
|
111
|
+
accounts: [
|
|
112
|
+
signer(payer, true),
|
|
113
|
+
account(associated, true),
|
|
114
|
+
account(owner, false),
|
|
115
|
+
account(mint, false),
|
|
116
|
+
account(exports.SYSTEM_PROGRAM, false),
|
|
117
|
+
account(exports.TOKEN_PROGRAM, false),
|
|
118
|
+
],
|
|
119
|
+
data: Uint8Array.of(1),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/** Token `TransferChecked` (12, u64 amount, u8 decimals). */
|
|
123
|
+
function transferChecked(source, mint, destination, authority, amount, decimals) {
|
|
124
|
+
return {
|
|
125
|
+
programId: exports.TOKEN_PROGRAM,
|
|
126
|
+
accounts: [
|
|
127
|
+
account(source, true),
|
|
128
|
+
account(mint, false),
|
|
129
|
+
account(destination, true),
|
|
130
|
+
signer(authority, false),
|
|
131
|
+
],
|
|
132
|
+
data: bytes(Uint8Array.of(12), u64(amount), u8(decimals)),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/** Memo v2: the UTF-8 text, no accounts. */
|
|
136
|
+
function memo(text) {
|
|
137
|
+
return { programId: exports.MEMO_PROGRAM, accounts: [], data: new TextEncoder().encode(text) };
|
|
138
|
+
}
|
|
139
|
+
/** A classic Token mint (82 bytes): its decimals, when initialized. */
|
|
140
|
+
function decodeMint(data) {
|
|
141
|
+
if (data.length !== exports.MINT_SIZE || data[45] !== 1)
|
|
142
|
+
return null;
|
|
143
|
+
return { decimals: data[44] };
|
|
144
|
+
}
|
|
145
|
+
/** A classic Token account (165 bytes): mint, owner, amount and state. */
|
|
146
|
+
function decodeTokenAccount(data) {
|
|
147
|
+
if (data.length !== exports.TOKEN_ACCOUNT_SIZE)
|
|
148
|
+
return null;
|
|
149
|
+
const state = data[108];
|
|
150
|
+
if (state !== 1 && state !== 2)
|
|
151
|
+
return null;
|
|
152
|
+
return {
|
|
153
|
+
mint: data.slice(0, 32),
|
|
154
|
+
owner: data.slice(32, 64),
|
|
155
|
+
amount: new DataView(data.buffer, data.byteOffset + 64, 8).getBigUint64(0, true),
|
|
156
|
+
frozen: state === 2,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=programs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"programs.js","sourceRoot":"","sources":["../../../src/adapters/solana/programs.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Solana program ids, account layouts and the instructions the driver builds, SDK-free\n * (built without `@solana/spl-token`). Every encoding is checked against a real devnet\n * transaction and `@solana/web3.js`'s own builders (`codec.test.ts`).\n */\nimport { ValidationError } from '../../core/errors/error';\nimport type { SolanaInstruction } from './types';\n\nexport const SYSTEM_PROGRAM = '11111111111111111111111111111111';\nexport const TOKEN_PROGRAM = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA';\nexport const TOKEN_2022_PROGRAM = 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb';\nexport const ASSOCIATED_TOKEN_PROGRAM = 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL';\nexport const MEMO_PROGRAM = 'MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr';\n/** The first Memo program; still parsed on received transactions. */\nexport const MEMO_V1_PROGRAM = 'Memo1UhkJRfHyvLMcVucJwxXeuD728EqVDDwQDxFMNo';\nexport const COMPUTE_BUDGET_PROGRAM = 'ComputeBudget111111111111111111111111111111';\nexport const VOTE_PROGRAM = 'Vote111111111111111111111111111111111111111';\n\n/** Classic Token program account sizes (bytes). */\nexport const MINT_SIZE = 82;\nexport const TOKEN_ACCOUNT_SIZE = 165;\n/** A transaction's maximum serialized size (the network packet limit). */\nexport const MAX_TRANSACTION_SIZE = 1232;\n/** The compute-unit limit of one transaction, and the default per instruction. */\nexport const MAX_COMPUTE_UNIT_LIMIT = 1_400_000n;\nexport const DEFAULT_INSTRUCTION_COMPUTE_UNITS = 200_000n;\n/** Memo text limit (UTF-8 bytes): a library policy that keeps every transfer well under\n * the packet limit. */\nexport const MAX_MEMO_BYTES = 256;\n\n/**\n * DataView and `Uint8Array.of` silently wrap a value that does not fit (2^64 + 5 lamports\n * would encode as 5); we refuse it with a fixed text: `INVALID_AMOUNT` for a u64\n * (lamports, token amounts and micro-lamports), `INVALID_INTENT` for a u8 (decimals) or a\n * u32 (compute units).\n */\nconst outOfRange = (bits: 8 | 32 | 64) =>\n new ValidationError(\n bits === 64 ? 'INVALID_AMOUNT' : 'INVALID_INTENT',\n `a value does not fit in its u${bits} field`,\n );\n\nfunction u8(value: number): Uint8Array {\n if (!Number.isInteger(value) || value < 0 || value > 0xff) throw outOfRange(8);\n return Uint8Array.of(value);\n}\n\nfunction u32(value: bigint): Uint8Array {\n if (value < 0n || value > 0xffff_ffffn) throw outOfRange(32);\n const out = new Uint8Array(4);\n new DataView(out.buffer).setUint32(0, Number(value), true);\n return out;\n}\n\nfunction u64(value: bigint): Uint8Array {\n if (value < 0n || value >= 2n ** 64n) throw outOfRange(64);\n const out = new Uint8Array(8);\n new DataView(out.buffer).setBigUint64(0, value, true);\n return out;\n}\n\nconst bytes = (...parts: Uint8Array[]): Uint8Array => {\n const out = new Uint8Array(parts.reduce((n, p) => n + p.length, 0));\n let offset = 0;\n for (const part of parts) {\n out.set(part, offset);\n offset += part.length;\n }\n return out;\n};\n\nconst signer = (address: string, writable: boolean) => ({\n address,\n signer: true,\n writable,\n});\nconst account = (address: string, writable: boolean) => ({\n address,\n signer: false,\n writable,\n});\n\n/** ComputeBudget `SetComputeUnitLimit` (2, u32). */\nexport function setComputeUnitLimit(units: bigint): SolanaInstruction {\n return {\n programId: COMPUTE_BUDGET_PROGRAM,\n accounts: [],\n data: bytes(Uint8Array.of(2), u32(units)),\n };\n}\n\n/** ComputeBudget `SetComputeUnitPrice` (3, u64 micro-lamports). */\nexport function setComputeUnitPrice(microLamports: bigint): SolanaInstruction {\n return {\n programId: COMPUTE_BUDGET_PROGRAM,\n accounts: [],\n data: bytes(Uint8Array.of(3), u64(microLamports)),\n };\n}\n\n/** System `Transfer` (2, u64 lamports). */\nexport function systemTransfer(\n from: string,\n to: string,\n lamports: bigint,\n): SolanaInstruction {\n return {\n programId: SYSTEM_PROGRAM,\n accounts: [signer(from, true), account(to, true)],\n data: bytes(u32(2n), u64(lamports)),\n };\n}\n\n/** Associated Token Account `CreateIdempotent` (1). */\nexport function createAssociatedTokenAccountIdempotent(\n payer: string,\n associated: string,\n owner: string,\n mint: string,\n): SolanaInstruction {\n return {\n programId: ASSOCIATED_TOKEN_PROGRAM,\n accounts: [\n signer(payer, true),\n account(associated, true),\n account(owner, false),\n account(mint, false),\n account(SYSTEM_PROGRAM, false),\n account(TOKEN_PROGRAM, false),\n ],\n data: Uint8Array.of(1),\n };\n}\n\n/** Token `TransferChecked` (12, u64 amount, u8 decimals). */\nexport function transferChecked(\n source: string,\n mint: string,\n destination: string,\n authority: string,\n amount: bigint,\n decimals: number,\n): SolanaInstruction {\n return {\n programId: TOKEN_PROGRAM,\n accounts: [\n account(source, true),\n account(mint, false),\n account(destination, true),\n signer(authority, false),\n ],\n data: bytes(Uint8Array.of(12), u64(amount), u8(decimals)),\n };\n}\n\n/** Memo v2: the UTF-8 text, no accounts. */\nexport function memo(text: string): SolanaInstruction {\n return { programId: MEMO_PROGRAM, accounts: [], data: new TextEncoder().encode(text) };\n}\n\n/** A classic Token mint (82 bytes): its decimals, when initialized. */\nexport function decodeMint(data: Uint8Array): { readonly decimals: number } | null {\n if (data.length !== MINT_SIZE || data[45] !== 1) return null;\n return { decimals: data[44] as number };\n}\n\n/** A classic Token account (165 bytes): mint, owner, amount and state. */\nexport function decodeTokenAccount(data: Uint8Array): {\n readonly mint: Uint8Array;\n readonly owner: Uint8Array;\n readonly amount: bigint;\n readonly frozen: boolean;\n} | null {\n if (data.length !== TOKEN_ACCOUNT_SIZE) return null;\n const state = data[108];\n if (state !== 1 && state !== 2) return null;\n return {\n mint: data.slice(0, 32),\n owner: data.slice(32, 64),\n amount: new DataView(data.buffer, data.byteOffset + 64, 8).getBigUint64(0, true),\n frozen: state === 2,\n };\n}\n"]}
|