Skip to content

Commit 524687c

Browse files
authored
Render sol amount as lamports (#161)
* Use lamports type/encoder/decoder for SolAmountTypeNode in renderers-js * Add test for sol amount node * Add changeset for sol amount node render
1 parent 87bab8a commit 524687c

File tree

9 files changed

+102
-23
lines changed

9 files changed

+102
-23
lines changed

.changeset/cyan-badgers-stare.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@kinobi-so/renderers-js': patch
3+
---
4+
5+
Use lamports type/encoder/decoder for SolAmountTypeNode

packages/renderers-js/e2e/system/idl.json

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,12 @@
3737
"kind": "structFieldTypeNode",
3838
"name": "lamportsPerSignature",
3939
"type": {
40-
"kind": "numberTypeNode",
41-
"format": "u64",
42-
"endian": "le"
40+
"kind": "solAmountTypeNode",
41+
"number": {
42+
"kind": "numberTypeNode",
43+
"format": "u64",
44+
"endian": "le"
45+
}
4346
},
4447
"docs": []
4548
}
@@ -90,9 +93,12 @@
9093
"kind": "instructionArgumentNode",
9194
"name": "lamports",
9295
"type": {
93-
"kind": "numberTypeNode",
94-
"format": "u64",
95-
"endian": "le"
96+
"kind": "solAmountTypeNode",
97+
"number": {
98+
"kind": "numberTypeNode",
99+
"format": "u64",
100+
"endian": "le"
101+
}
96102
},
97103
"docs": []
98104
},

packages/renderers-js/e2e/system/src/generated/accounts/nonce.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import {
1515
fetchEncodedAccounts,
1616
getAddressDecoder,
1717
getAddressEncoder,
18+
getLamportsDecoder,
19+
getLamportsEncoder,
1820
getStructDecoder,
1921
getStructEncoder,
2022
getU64Decoder,
@@ -27,6 +29,7 @@ import {
2729
type Encoder,
2830
type FetchAccountConfig,
2931
type FetchAccountsConfig,
32+
type LamportsUnsafeBeyond2Pow53Minus1,
3033
type MaybeAccount,
3134
type MaybeEncodedAccount,
3235
} from '@solana/web3.js';
@@ -46,15 +49,15 @@ export type Nonce = {
4649
state: NonceState;
4750
authority: Address;
4851
blockhash: Address;
49-
lamportsPerSignature: bigint;
52+
lamportsPerSignature: LamportsUnsafeBeyond2Pow53Minus1;
5053
};
5154

5255
export type NonceArgs = {
5356
version: NonceVersionArgs;
5457
state: NonceStateArgs;
5558
authority: Address;
5659
blockhash: Address;
57-
lamportsPerSignature: number | bigint;
60+
lamportsPerSignature: LamportsUnsafeBeyond2Pow53Minus1;
5861
};
5962

6063
export function getNonceEncoder(): Encoder<NonceArgs> {
@@ -63,7 +66,7 @@ export function getNonceEncoder(): Encoder<NonceArgs> {
6366
['state', getNonceStateEncoder()],
6467
['authority', getAddressEncoder()],
6568
['blockhash', getAddressEncoder()],
66-
['lamportsPerSignature', getU64Encoder()],
69+
['lamportsPerSignature', getLamportsEncoder(getU64Encoder())],
6770
]);
6871
}
6972

@@ -73,7 +76,7 @@ export function getNonceDecoder(): Decoder<Nonce> {
7376
['state', getNonceStateDecoder()],
7477
['authority', getAddressDecoder()],
7578
['blockhash', getAddressDecoder()],
76-
['lamportsPerSignature', getU64Decoder()],
79+
['lamportsPerSignature', getLamportsDecoder(getU64Decoder())],
7780
]);
7881
}
7982

packages/renderers-js/e2e/system/src/generated/instructions/createAccount.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import {
1111
combineCodec,
1212
getAddressDecoder,
1313
getAddressEncoder,
14+
getLamportsDecoder,
15+
getLamportsEncoder,
1416
getStructDecoder,
1517
getStructEncoder,
1618
getU32Decoder,
@@ -27,6 +29,7 @@ import {
2729
type IInstruction,
2830
type IInstructionWithAccounts,
2931
type IInstructionWithData,
32+
type LamportsUnsafeBeyond2Pow53Minus1,
3033
type TransactionSigner,
3134
type WritableSignerAccount,
3235
} from '@solana/web3.js';
@@ -60,13 +63,13 @@ export type CreateAccountInstruction<
6063

6164
export type CreateAccountInstructionData = {
6265
discriminator: number;
63-
lamports: bigint;
66+
lamports: LamportsUnsafeBeyond2Pow53Minus1;
6467
space: bigint;
6568
programAddress: Address;
6669
};
6770

6871
export type CreateAccountInstructionDataArgs = {
69-
lamports: number | bigint;
72+
lamports: LamportsUnsafeBeyond2Pow53Minus1;
7073
space: number | bigint;
7174
programAddress: Address;
7275
};
@@ -75,7 +78,7 @@ export function getCreateAccountInstructionDataEncoder(): Encoder<CreateAccountI
7578
return transformEncoder(
7679
getStructEncoder([
7780
['discriminator', getU32Encoder()],
78-
['lamports', getU64Encoder()],
81+
['lamports', getLamportsEncoder(getU64Encoder())],
7982
['space', getU64Encoder()],
8083
['programAddress', getAddressEncoder()],
8184
]),
@@ -86,7 +89,7 @@ export function getCreateAccountInstructionDataEncoder(): Encoder<CreateAccountI
8689
export function getCreateAccountInstructionDataDecoder(): Decoder<CreateAccountInstructionData> {
8790
return getStructDecoder([
8891
['discriminator', getU32Decoder()],
89-
['lamports', getU64Decoder()],
92+
['lamports', getLamportsDecoder(getU64Decoder())],
9093
['space', getU64Decoder()],
9194
['programAddress', getAddressDecoder()],
9295
]);

packages/renderers-js/e2e/token/idl.json

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2800,9 +2800,12 @@
28002800
"kind": "instructionArgumentNode",
28012801
"name": "lamports",
28022802
"type": {
2803-
"kind": "numberTypeNode",
2804-
"format": "u64",
2805-
"endian": "le"
2803+
"kind": "solAmountTypeNode",
2804+
"number": {
2805+
"kind": "numberTypeNode",
2806+
"format": "u64",
2807+
"endian": "le"
2808+
}
28062809
},
28072810
"docs": []
28082811
},

packages/renderers-js/e2e/token/src/generated/instructions/createAccount.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import {
1111
combineCodec,
1212
getAddressDecoder,
1313
getAddressEncoder,
14+
getLamportsDecoder,
15+
getLamportsEncoder,
1416
getStructDecoder,
1517
getStructEncoder,
1618
getU32Decoder,
@@ -27,6 +29,7 @@ import {
2729
type IInstruction,
2830
type IInstructionWithAccounts,
2931
type IInstructionWithData,
32+
type LamportsUnsafeBeyond2Pow53Minus1,
3033
type TransactionSigner,
3134
type WritableSignerAccount,
3235
} from '@solana/web3.js';
@@ -60,13 +63,13 @@ export type CreateAccountInstruction<
6063

6164
export type CreateAccountInstructionData = {
6265
discriminator: number;
63-
lamports: bigint;
66+
lamports: LamportsUnsafeBeyond2Pow53Minus1;
6467
space: bigint;
6568
programAddress: Address;
6669
};
6770

6871
export type CreateAccountInstructionDataArgs = {
69-
lamports: number | bigint;
72+
lamports: LamportsUnsafeBeyond2Pow53Minus1;
7073
space: number | bigint;
7174
programAddress: Address;
7275
};
@@ -75,7 +78,7 @@ export function getCreateAccountInstructionDataEncoder(): Encoder<CreateAccountI
7578
return transformEncoder(
7679
getStructEncoder([
7780
['discriminator', getU32Encoder()],
78-
['lamports', getU64Encoder()],
81+
['lamports', getLamportsEncoder(getU64Encoder())],
7982
['space', getU64Encoder()],
8083
['programAddress', getAddressEncoder()],
8184
]),
@@ -86,7 +89,7 @@ export function getCreateAccountInstructionDataEncoder(): Encoder<CreateAccountI
8689
export function getCreateAccountInstructionDataDecoder(): Decoder<CreateAccountInstructionData> {
8790
return getStructDecoder([
8891
['discriminator', getU32Decoder()],
89-
['lamports', getU64Decoder()],
92+
['lamports', getLamportsDecoder(getU64Decoder())],
9093
['space', getU64Decoder()],
9194
['programAddress', getAddressDecoder()],
9295
]);

packages/renderers-js/src/ImportMap.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ const DEFAULT_EXTERNAL_MODULE_MAP: Record<string, string> = {
1414
solanaInstructions: '@solana/web3.js',
1515
solanaOptions: '@solana/web3.js',
1616
solanaPrograms: '@solana/web3.js',
17+
solanaRpcTypes: '@solana/web3.js',
1718
solanaSigners: '@solana/web3.js',
1819
};
1920

@@ -28,6 +29,7 @@ const DEFAULT_GRANULAR_EXTERNAL_MODULE_MAP: Record<string, string> = {
2829
solanaInstructions: '@solana/instructions',
2930
solanaOptions: '@solana/codecs',
3031
solanaPrograms: '@solana/programs',
32+
solanaRpcTypes: '@solana/rpc-types',
3133
solanaSigners: '@solana/signers',
3234
};
3335

packages/renderers-js/src/getTypeManifestVisitor.ts

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -701,8 +701,26 @@ export function getTypeManifestVisitor(input: {
701701
return manifest;
702702
},
703703

704-
visitSolAmountType(solAmountType, { self }) {
705-
return visit(solAmountType.number, self);
704+
visitSolAmountType({ number }, { self }) {
705+
const numberManifest = visit(number, self);
706+
707+
const lamportsType = 'LamportsUnsafeBeyond2Pow53Minus1';
708+
const lamportsImport = new ImportMap().add(
709+
'solanaRpcTypes',
710+
'type LamportsUnsafeBeyond2Pow53Minus1',
711+
);
712+
713+
return {
714+
...numberManifest,
715+
decoder: numberManifest.decoder
716+
.mapRender(r => `getLamportsDecoder(${r})`)
717+
.addImports('solanaRpcTypes', 'getLamportsDecoder'),
718+
encoder: numberManifest.encoder
719+
.mapRender(r => `getLamportsEncoder(${r})`)
720+
.addImports('solanaRpcTypes', 'getLamportsEncoder'),
721+
looseType: fragment(lamportsType, lamportsImport),
722+
strictType: fragment(lamportsType, lamportsImport),
723+
};
706724
},
707725

708726
visitSomeValue(node, { self }) {
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { definedTypeNode, numberTypeNode, solAmountTypeNode } from '@kinobi-so/nodes';
2+
import { visit } from '@kinobi-so/visitors-core';
3+
import { test } from 'vitest';
4+
5+
import { getRenderMapVisitor } from '../../src';
6+
import { renderMapContains, renderMapContainsImports } from '../_setup';
7+
8+
test('it renders size prefix codecs', async () => {
9+
// Given the following node.
10+
const node = definedTypeNode({
11+
name: 'myType',
12+
type: solAmountTypeNode(numberTypeNode('u64')),
13+
});
14+
15+
// When we render it.
16+
const renderMap = visit(node, getRenderMapVisitor());
17+
18+
// Then we expect the following types and codecs to be exported.
19+
await renderMapContains(renderMap, 'types/myType.ts', [
20+
'export type MyType = LamportsUnsafeBeyond2Pow53Minus1',
21+
'export type MyTypeArgs = MyType',
22+
'export function getMyTypeEncoder(): Encoder<MyTypeArgs> { return getLamportsEncoder(getU64Encoder()); }',
23+
'export function getMyTypeDecoder(): Decoder<MyType> { return getLamportsDecoder(getU64Decoder()); }',
24+
]);
25+
26+
// And we expect the following type and codec imports.
27+
await renderMapContainsImports(renderMap, 'types/myType.ts', {
28+
'@solana/web3.js': [
29+
'LamportsUnsafeBeyond2Pow53Minus1',
30+
'getLamportsEncoder',
31+
'getLamportsDecoder',
32+
'getU64Encoder',
33+
'getU64Decoder',
34+
],
35+
});
36+
});

0 commit comments

Comments
 (0)