123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 |
- const anchor = require('@project-serum/anchor')
- const PublicKey = anchor.web3.PublicKey
- const BN = anchor.BN
- const assert = require('assert')
- describe('zero-copy', () => {
- // Configure the client to use the local cluster.
- anchor.setProvider(anchor.Provider.env())
- const program = anchor.workspace.ZeroCopy
- const programCpi = anchor.workspace.ZeroCpi
- const foo = anchor.web3.Keypair.generate()
- it('Is creates a zero copy account', async () => {
- await program.rpc.createFoo({
- accounts: {
- foo: foo.publicKey,
- authority: program.provider.wallet.publicKey,
- rent: anchor.web3.SYSVAR_RENT_PUBKEY,
- },
- instructions: [await program.account.foo.createInstruction(foo)],
- signers: [foo],
- })
- const account = await program.account.foo.fetch(foo.publicKey)
- assert.ok(
- JSON.stringify(account.authority.toBuffer()) ===
- JSON.stringify(program.provider.wallet.publicKey.toBuffer())
- )
- assert.ok(account.data.toNumber() === 0)
- assert.ok(account.secondData.toNumber() === 0)
- assert.ok(
- JSON.stringify(account.secondAuthority) ===
- JSON.stringify([...program.provider.wallet.publicKey.toBuffer()])
- )
- })
- it('Updates a zero copy account field', async () => {
- await program.rpc.updateFoo(new BN(1234), {
- accounts: {
- foo: foo.publicKey,
- authority: program.provider.wallet.publicKey,
- },
- })
- const account = await program.account.foo.fetch(foo.publicKey)
- assert.ok(
- JSON.stringify(account.authority.toBuffer()) ===
- JSON.stringify(program.provider.wallet.publicKey.toBuffer())
- )
- assert.ok(account.data.toNumber() === 1234)
- assert.ok(account.secondData.toNumber() === 0)
- assert.ok(
- JSON.stringify(account.secondAuthority) ===
- JSON.stringify([...program.provider.wallet.publicKey.toBuffer()])
- )
- })
- it('Updates a a second zero copy account field', async () => {
- await program.rpc.updateFooSecond(new BN(55), {
- accounts: {
- foo: foo.publicKey,
- secondAuthority: program.provider.wallet.publicKey,
- },
- })
- const account = await program.account.foo.fetch(foo.publicKey)
- assert.ok(
- JSON.stringify(account.authority.toBuffer()) ===
- JSON.stringify(program.provider.wallet.publicKey.toBuffer())
- )
- assert.ok(account.data.toNumber() === 1234)
- assert.ok(account.secondData.toNumber() === 55)
- assert.ok(
- JSON.stringify(account.secondAuthority) ===
- JSON.stringify([...program.provider.wallet.publicKey.toBuffer()])
- )
- })
- it('Creates an associated zero copy account', async () => {
- await program.rpc.createBar({
- accounts: {
- bar: (
- await PublicKey.findProgramAddress(
- [program.provider.wallet.publicKey.toBuffer(), foo.publicKey.toBuffer()],
- program.programId
- )
- )[0],
- authority: program.provider.wallet.publicKey,
- foo: foo.publicKey,
- systemProgram: anchor.web3.SystemProgram.programId,
- },
- })
- const bar = (
- await PublicKey.findProgramAddress(
- [program.provider.wallet.publicKey.toBuffer(), foo.publicKey.toBuffer()],
- program.programId
- )
- )[0]
- const barAccount = await program.account.bar.fetch(bar)
- assert.ok(barAccount.authority.equals(program.provider.wallet.publicKey))
- assert.ok(barAccount.data.toNumber() === 0)
- })
- it('Updates an associated zero copy account', async () => {
- const bar = (
- await PublicKey.findProgramAddress(
- [program.provider.wallet.publicKey.toBuffer(), foo.publicKey.toBuffer()],
- program.programId
- )
- )[0]
- await program.rpc.updateBar(new BN(99), {
- accounts: {
- bar,
- authority: program.provider.wallet.publicKey,
- foo: foo.publicKey,
- },
- })
- const barAccount = await program.account.bar.fetch(bar)
- assert.ok(barAccount.authority.equals(program.provider.wallet.publicKey))
- assert.ok(barAccount.data.toNumber() === 99)
- // Check zero_copy CPI
- await programCpi.rpc.checkCpi(new BN(1337), {
- accounts: {
- bar,
- authority: program.provider.wallet.publicKey,
- foo: foo.publicKey,
- zeroCopyProgram: program.programId,
- },
- })
- const barAccountAfterCpi = await program.account.bar.fetch(bar)
- assert.ok(barAccountAfterCpi.authority.equals(program.provider.wallet.publicKey))
- assert.ok(barAccountAfterCpi.data.toNumber() === 1337)
- })
- const eventQ = anchor.web3.Keypair.generate()
- const size = 1000000 + 8 // Account size in bytes.
- it('Creates a large event queue', async () => {
- await program.rpc.createLargeAccount({
- accounts: {
- eventQ: eventQ.publicKey,
- rent: anchor.web3.SYSVAR_RENT_PUBKEY,
- },
- instructions: [await program.account.eventQ.createInstruction(eventQ, size)],
- signers: [eventQ],
- })
- const account = await program.account.eventQ.fetch(eventQ.publicKey)
- assert.ok(account.events.length === 25000)
- account.events.forEach((event) => {
- assert.ok(event.from.equals(PublicKey.default))
- assert.ok(event.data.toNumber() === 0)
- })
- })
- it('Updates a large event queue', async () => {
- // Set index 0.
- await program.rpc.updateLargeAccount(0, new BN(48), {
- accounts: {
- eventQ: eventQ.publicKey,
- from: program.provider.wallet.publicKey,
- },
- })
- // Verify update.
- let account = await program.account.eventQ.fetch(eventQ.publicKey)
- assert.ok(account.events.length === 25000)
- account.events.forEach((event, idx) => {
- if (idx === 0) {
- assert.ok(event.from.equals(program.provider.wallet.publicKey))
- assert.ok(event.data.toNumber() === 48)
- } else {
- assert.ok(event.from.equals(PublicKey.default))
- assert.ok(event.data.toNumber() === 0)
- }
- })
- // Set index 11111.
- await program.rpc.updateLargeAccount(11111, new BN(1234), {
- accounts: {
- eventQ: eventQ.publicKey,
- from: program.provider.wallet.publicKey,
- },
- })
- // Verify update.
- account = await program.account.eventQ.fetch(eventQ.publicKey)
- assert.ok(account.events.length === 25000)
- account.events.forEach((event, idx) => {
- if (idx === 0) {
- assert.ok(event.from.equals(program.provider.wallet.publicKey))
- assert.ok(event.data.toNumber() === 48)
- } else if (idx === 11111) {
- assert.ok(event.from.equals(program.provider.wallet.publicKey))
- assert.ok(event.data.toNumber() === 1234)
- } else {
- assert.ok(event.from.equals(PublicKey.default))
- assert.ok(event.data.toNumber() === 0)
- }
- })
- // Set last index.
- await program.rpc.updateLargeAccount(24999, new BN(99), {
- accounts: {
- eventQ: eventQ.publicKey,
- from: program.provider.wallet.publicKey,
- },
- })
- // Verify update.
- account = await program.account.eventQ.fetch(eventQ.publicKey)
- assert.ok(account.events.length === 25000)
- account.events.forEach((event, idx) => {
- if (idx === 0) {
- assert.ok(event.from.equals(program.provider.wallet.publicKey))
- assert.ok(event.data.toNumber() === 48)
- } else if (idx === 11111) {
- assert.ok(event.from.equals(program.provider.wallet.publicKey))
- assert.ok(event.data.toNumber() === 1234)
- } else if (idx === 24999) {
- assert.ok(event.from.equals(program.provider.wallet.publicKey))
- assert.ok(event.data.toNumber() === 99)
- } else {
- assert.ok(event.from.equals(PublicKey.default))
- assert.ok(event.data.toNumber() === 0)
- }
- })
- })
- it('Errors when setting an out of bounds index', async () => {
- // Fail to set non existing index.
- await assert.rejects(
- async () => {
- await program.rpc.updateLargeAccount(25000, new BN(1), {
- accounts: {
- eventQ: eventQ.publicKey,
- from: program.provider.wallet.publicKey,
- },
- })
- },
- (err) => {
- console.log('err', err)
- return true
- }
- )
- })
- })
|