| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309 |
- import {
- accountNode,
- accountValueNode,
- argumentValueNode,
- arrayTypeNode,
- bytesTypeNode,
- constantPdaSeedNodeFromBytes,
- definedTypeLinkNode,
- definedTypeNode,
- enumEmptyVariantTypeNode,
- enumTupleVariantTypeNode,
- enumTypeNode,
- errorNode,
- fieldDiscriminatorNode,
- fixedCountNode,
- fixedSizeTypeNode,
- instructionAccountNode,
- instructionArgumentNode,
- instructionNode,
- numberTypeNode,
- pdaNode,
- pdaSeedValueNode,
- pdaValueNode,
- programNode,
- publicKeyTypeNode,
- structFieldTypeNode,
- structTypeNode,
- tupleTypeNode,
- variablePdaSeedNode,
- } from '@codama/nodes';
- import { expect, test } from 'vitest';
- import { getAnchorDiscriminatorV01, programNodeFromAnchorV01 } from '../../src';
- test('it creates program nodes', () => {
- const node = programNodeFromAnchorV01({
- accounts: [{ discriminator: [246, 28, 6, 87, 251, 45, 50, 42], name: 'MyAccount' }],
- address: '1111',
- errors: [{ code: 42, msg: 'my error message', name: 'myError' }],
- instructions: [
- {
- accounts: [
- {
- name: 'authority',
- pda: {
- seeds: [
- { kind: 'const', value: [42, 31, 29] },
- { kind: 'account', path: 'owner' },
- { kind: 'arg', path: 'amount' },
- ],
- },
- },
- {
- name: 'owner',
- },
- {
- name: 'some_account',
- },
- ],
- args: [
- {
- name: 'amount',
- type: 'u8',
- },
- ],
- discriminator: [246, 28, 6, 87, 251, 45, 50, 42],
- name: 'my_instruction',
- },
- ],
- metadata: { name: 'my_program', spec: '0.1.0', version: '1.2.3' },
- types: [{ name: 'MyAccount', type: { fields: [{ name: 'delegate', type: 'pubkey' }], kind: 'struct' } }],
- });
- expect(node).toEqual(
- programNode({
- accounts: [
- accountNode({
- data: structTypeNode([
- structFieldTypeNode({
- defaultValue: getAnchorDiscriminatorV01([246, 28, 6, 87, 251, 45, 50, 42]),
- defaultValueStrategy: 'omitted',
- name: 'discriminator',
- type: fixedSizeTypeNode(bytesTypeNode(), 8),
- }),
- structFieldTypeNode({
- name: 'delegate',
- type: publicKeyTypeNode(),
- }),
- ]),
- discriminators: [fieldDiscriminatorNode('discriminator')],
- name: 'myAccount',
- }),
- ],
- definedTypes: [],
- errors: [
- errorNode({
- code: 42,
- docs: ['myError: my error message'],
- message: 'my error message',
- name: 'myError',
- }),
- ],
- instructions: [
- instructionNode({
- accounts: [
- instructionAccountNode({
- defaultValue: pdaValueNode(
- pdaNode({
- name: 'authority',
- seeds: [
- constantPdaSeedNodeFromBytes('base58', 'F9bS'),
- variablePdaSeedNode('owner', publicKeyTypeNode()),
- variablePdaSeedNode('amount', numberTypeNode('u8')),
- ],
- }),
- [
- pdaSeedValueNode('owner', accountValueNode('owner')),
- pdaSeedValueNode('amount', argumentValueNode('amount')),
- ],
- ),
- isSigner: false,
- isWritable: false,
- name: 'authority',
- }),
- instructionAccountNode({
- isSigner: false,
- isWritable: false,
- name: 'owner',
- }),
- instructionAccountNode({
- isSigner: false,
- isWritable: false,
- name: 'someAccount',
- }),
- ],
- arguments: [
- instructionArgumentNode({
- defaultValue: getAnchorDiscriminatorV01([246, 28, 6, 87, 251, 45, 50, 42]),
- defaultValueStrategy: 'omitted',
- name: 'discriminator',
- type: fixedSizeTypeNode(bytesTypeNode(), 8),
- }),
- instructionArgumentNode({ name: 'amount', type: numberTypeNode('u8') }),
- ],
- discriminators: [fieldDiscriminatorNode('discriminator')],
- name: 'myInstruction',
- }),
- ],
- name: 'myProgram',
- origin: 'anchor',
- pdas: [],
- publicKey: '1111',
- version: '1.2.3',
- }),
- );
- });
- test('it unwraps and removes generic types', () => {
- const node = programNodeFromAnchorV01({
- address: '1111',
- instructions: [],
- metadata: { name: 'my_program', spec: '0.1.0', version: '1.2.3' },
- types: [
- {
- generics: [
- { kind: 'const', name: 'N', type: 'usize' },
- { kind: 'type', name: 'T' },
- ],
- name: 'SimpleAllocator',
- type: {
- fields: [
- {
- name: 'state',
- type: { array: [{ defined: { name: 'ItemState' } }, { generic: 'N' }] },
- },
- {
- name: 'data',
- type: { array: [{ generic: 'T' }, { generic: 'N' }] },
- },
- ],
- kind: 'struct',
- },
- },
- {
- name: 'AccountData',
- type: {
- kind: 'enum',
- variants: [
- { name: 'Unknown' },
- {
- fields: [
- {
- defined: {
- generics: [
- { kind: 'const', value: '1000' },
- { kind: 'type', type: { defined: { name: 'VirtualTimelockAccount' } } },
- ],
- name: 'SimpleAllocator',
- },
- },
- ],
- name: 'Timelock',
- },
- {
- fields: [
- {
- defined: {
- generics: [
- { kind: 'const', value: '500' },
- { kind: 'type', type: { defined: { name: 'VirtualDurableNonce' } } },
- ],
- name: 'SimpleAllocator',
- },
- },
- ],
- name: 'Nonce',
- },
- {
- fields: [
- {
- defined: {
- generics: [
- { kind: 'const', value: '250' },
- { kind: 'type', type: { defined: { name: 'VirtualRelayAccount' } } },
- ],
- name: 'SimpleAllocator',
- },
- },
- ],
- name: 'Relay',
- },
- ],
- },
- },
- ],
- });
- expect(node).toEqual(
- programNode({
- definedTypes: [
- definedTypeNode({
- name: 'AccountData',
- type: enumTypeNode([
- enumEmptyVariantTypeNode('unknown'),
- enumTupleVariantTypeNode(
- 'timelock',
- tupleTypeNode([
- structTypeNode([
- structFieldTypeNode({
- name: 'state',
- type: arrayTypeNode(definedTypeLinkNode('itemState'), fixedCountNode(1000)),
- }),
- structFieldTypeNode({
- name: 'data',
- type: arrayTypeNode(
- definedTypeLinkNode('virtualTimelockAccount'),
- fixedCountNode(1000),
- ),
- }),
- ]),
- ]),
- ),
- enumTupleVariantTypeNode(
- 'nonce',
- tupleTypeNode([
- structTypeNode([
- structFieldTypeNode({
- name: 'state',
- type: arrayTypeNode(definedTypeLinkNode('itemState'), fixedCountNode(500)),
- }),
- structFieldTypeNode({
- name: 'data',
- type: arrayTypeNode(
- definedTypeLinkNode('virtualDurableNonce'),
- fixedCountNode(500),
- ),
- }),
- ]),
- ]),
- ),
- enumTupleVariantTypeNode(
- 'relay',
- tupleTypeNode([
- structTypeNode([
- structFieldTypeNode({
- name: 'state',
- type: arrayTypeNode(definedTypeLinkNode('itemState'), fixedCountNode(250)),
- }),
- structFieldTypeNode({
- name: 'data',
- type: arrayTypeNode(
- definedTypeLinkNode('virtualRelayAccount'),
- fixedCountNode(250),
- ),
- }),
- ]),
- ]),
- ),
- ]),
- }),
- ],
- name: 'myProgram',
- origin: 'anchor',
- pdas: [],
- publicKey: '1111',
- version: '1.2.3',
- }),
- );
- });
|