@fewcha/aptos
Version:
131 lines (110 loc) • 4.87 kB
text/typescript
/* eslint-disable no-console */
import { AptosClient, AptosAccount, FaucetClient, BCS, TxnBuilderTypes, Provider, Network, TokenClient } from "aptos";
import assert from "assert";
const NODE_URL = process.env.APTOS_NODE_URL || "https://fullnode.devnet.aptoslabs.com";
const FAUCET_URL = process.env.APTOS_FAUCET_URL || "https://faucet.devnet.aptoslabs.com";
export const aptosCoinStore = "0x1::coin::CoinStore<0x1::aptos_coin::AptosCoin>";
const {
AccountAddress,
TypeTagStruct,
EntryFunction,
StructTag,
TransactionPayloadEntryFunction,
RawTransaction,
ChainId,
} = TxnBuilderTypes;
/**
* This code example demonstrates the process of moving test coins from one account to another.
*/
(async () => {
const client = new AptosClient(NODE_URL);
const faucetClient = new FaucetClient(NODE_URL, FAUCET_URL);
const tokenClient = new TokenClient(client);
// Generates key pair for a new account
const account1 = new AptosAccount();
await faucetClient.fundAccount(account1.address(), 100_000_000);
let resources = await client.getAccountResources(account1.address());
let accountResource = resources.find((r: any) => r.type === aptosCoinStore);
let balance = parseInt((accountResource?.data as any).coin.value);
assert(balance === 100_000_000);
console.log(`account1 coins: ${balance}. Should be 100_000_000!`);
const account2 = new AptosAccount();
// TS SDK support 3 types of transaction payloads: `EntryFunction`, `Script` and `Module`.
// See https://aptos-labs.github.io/ts-sdk-doc/ for the details.
const entryFunctionPayload = new TransactionPayloadEntryFunction(
EntryFunction.natural(
// Fully qualified module name, `AccountAddress::ModuleName`
"0x1::aptos_account",
// Module function
"transfer",
// The coin type to transfer
[],
// Arguments for function `transfer`: receiver account address and amount to transfer
[BCS.bcsToBytes(AccountAddress.fromHex(account2.address())), BCS.bcsSerializeUint64(717)],
),
);
const [{ sequence_number: sequenceNumber }, chainId] = await Promise.all([
client.getAccount(account1.address()),
client.getChainId(),
]);
// See class definiton here
// https://aptos-labs.github.io/ts-sdk-doc/classes/TxnBuilderTypes.RawTransaction.html#constructor.
const rawTxn = new RawTransaction(
// Transaction sender account address
AccountAddress.fromHex(account1.address()),
BigInt(sequenceNumber),
entryFunctionPayload,
// Max gas unit to spend
BigInt(10000),
// Gas price per unit
BigInt(100),
// Expiration timestamp. Transaction is discarded if it is not executed within 10 seconds from now.
BigInt(Math.floor(Date.now() / 1000) + 10),
new ChainId(chainId),
);
// Sign the raw transaction with account1's private key
const bcsTxn = AptosClient.generateBCSTransaction(account1, rawTxn);
const transactionRes = await client.submitSignedBCSTransaction(bcsTxn);
await client.waitForTransaction(transactionRes.hash);
resources = await client.getAccountResources(account2.address());
accountResource = resources.find((r: any) => r.type === aptosCoinStore);
balance = parseInt((accountResource?.data as any).coin.value);
assert(balance === 717);
console.log(`account2 coins: ${balance}. Should be 717!`);
const provider = new Provider(Network.DEVNET);
console.log("\n=== Checking if indexer devnet chainId same as fullnode chainId ===");
const indexerLedgerInfo = await provider.getIndexerLedgerInfo();
const fullNodeChainId = await provider.getChainId();
console.log(
`\n fullnode chain id is: ${fullNodeChainId}, indexer chain id is: ${indexerLedgerInfo.ledger_infos[0].chain_id}`,
);
if (indexerLedgerInfo.ledger_infos[0].chain_id !== fullNodeChainId) {
console.log(`\n fullnode chain id and indexer chain id are not synced, skipping rest of tests`);
return;
}
console.log("=== Creating account1's NFT Collection and Token ===");
const collectionName = "Alice's";
const tokenName = "Alice's first token";
// Create the collection.
// :!:>section_4
const txnHash1 = await tokenClient.createCollection(
account1,
collectionName,
"Alice's simple collection",
"https://alice.com",
); // <:!:section_4
await client.waitForTransaction(txnHash1, { checkSuccess: true });
// Create a token in that collection.
// :!:>section_5
const txnHash2 = await tokenClient.createToken(
account1,
collectionName,
tokenName,
"Alice's simple token",
1,
"https://aptos.dev/img/nyan.jpeg",
); // <:!:section_5
await client.waitForTransaction(txnHash2, { checkSuccess: true });
const nfts = await provider.getAccountNFTs(account1.address().hex());
console.log(`account1 current token ownership: ${nfts.current_token_ownerships[0].amount}. Should be 1`);
})();