BcsSerializer
Example 1
Use bcs.BcsSerializer
to serialize scriptFunction:
const { arrayify } = require('@ethersproject/bytes');
const { bcs } = require('@starcoin/starcoin');
const { utils } = require('@starcoin/starcoin');
const functionId = '0x1::TransferScripts::peer_to_peer_v2'
const strTypeArgs = ['0x1::STC::STC']
const tyArgs = utils.tx.encodeStructTypeTags(strTypeArgs)
const args = [
arrayify('0x1df9157f14b0041eed18dcc56520d829'),
arrayify('0x0060d743dd500b000000000000000000')
]
const scriptFunction = utils.tx.encodeScriptFunction(functionId, tyArgs, args);
const se = new bcs.BcsSerializer();
scriptFunction.serialize(se);
const payloadInHex = utils.hex.toHexString(se.getBytes());
console.log(payloadInHex);
Result:
0x02000000000000000000000000000000010f5472616e73666572536372697074730f706565725f746f5f706565725f763201070000000000000000000000000000000103535443035354430002101df9157f14b0041eed18dcc56520d829100060d743dd500b000000000000000000
Reference: BcsSerializer with scriptFunction
Exmple 2
Use bcs.Serializer
to serialize transaction arguments:
const { arrayify, hexlify } = require('@ethersproject/bytes');
const { bcs } = require('@starcoin/starcoin');
const { utils } = require('@starcoin/starcoin');
const sendAmount = 0.01;
const config = { creator: "0xb2aa52f94db4516c5beecef363af850a", id: 1, type_args_1: "0x1::OnChainConfigDao::OnChainConfigUpdate<0x1::TransactionPublishOption::TransactionPublishOption, d::e::f>" };
const functionId = '0x1::DaoVoteScripts::cast_vote';
const strTypeArgs = ['0x1::STC::STC', config.type_args_1]
const tyArgs = utils.tx.encodeStructTypeTags(strTypeArgs)
const proposerAdressHex = config.creator;
const proposalId = config.id;
const agree = true; // yes: true; no: false
const votes = sendAmount * 1000000000; // sendAmount * 1e9
// Multiple BcsSerializers should be used in different closures, otherwise, the latter will be contaminated by the former.
const proposalIdSCSHex = (function () {
const se = new bcs.BcsSerializer();
se.serializeU64(proposalId);
return hexlify(se.getBytes());
})();
// Multiple BcsSerializers should be used in different closures, otherwise, the latter will be contaminated by the former.
const agreeSCSHex = (function () {
const se = new bcs.BcsSerializer();
se.serializeBool(agree);
return hexlify(se.getBytes());
})();
// Multiple BcsSerializers should be used in different closures, otherwise, the latter will be contaminated by the former.
const votesSCSHex = (function () {
const se = new bcs.BcsSerializer();
se.serializeU128(votes);
return hexlify(se.getBytes());
})();
const args = [
arrayify(proposerAdressHex),
arrayify(proposalIdSCSHex),
arrayify(agreeSCSHex),
arrayify(votesSCSHex),
];
console.log({ args });
Result:
{
args: [
Uint8Array(16) [
178, 170, 82, 249, 77,
180, 81, 108, 91, 238,
206, 243, 99, 175, 133,
10
],
Uint8Array(8) [
1, 0, 0, 0,
0, 0, 0, 0
],
Uint8Array(1) [ 1 ],
Uint8Array(16) [
128, 150, 152, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0
]
]
}
BcsDeserializer
Example 1
Use bcs.BcsDeserializer
to deserialize transaction data.
const { arrayify } = require('@ethersproject/bytes');
const { bcs } = require('@starcoin/starcoin');
const { starcoin_types } = require('@starcoin/starcoin');
const data = '...';
const bytes = arrayify(data);
const de = new bcs.BcsDeserializer(bytes);
const scsData = starcoin_types.SignedUserTransaction.deserialize(de);
Reference: decodeSignedUserTransaction
Example 2
Use bcs.BcsDeserializer
to deserialize transaction payload.
const { arrayify } = require('@ethersproject/bytes');
const { bcs } = require('@starcoin/starcoin');
const { starcoin_types } = require('@starcoin/starcoin');
const payload = '...';
const bytes = arrayify(payload);
const de = new bcs.BcsDeserializer(bytes);
const bcsTxnPayload = starcoin_types.TransactionPayload.deserialize(de);
Reference: decodeTransactionPayload
Example 3
Use bcs.BcsDeserializer
to deserialize package transaction payload hex.
const { arrayify } = require('@ethersproject/bytes');
cosnt { addHexPrefix } = require('ethereumjs-util');
const { bcs } = require('@starcoin/starcoin');
const { starcoin_types } = require('@starcoin/starcoin');
const packageHex = '...';
const bytes = arrayify(packageHex);
const deserializer = new bcs.BcsDeserializer(arrayify(addHexPrefix(packageHex)))
const transactionPayload = starcoin_types.TransactionPayloadVariantPackage.load(deserializer)
Reference: packageHexToTransactionPayload
Example 4
Use bcs.BcsDeserializer
to convert address to SCS.
const { bcs } = require('@starcoin/starcoin');
const { utils } = require('@starcoin/starcoin');
const { starcoin_types } = require('@starcoin/starcoin');
const addr = '0x...';
const bytes = utils.hex.fromHexString(addr, 16 * 2);
cosnt addressSCS = starcoin_types.AccountAddress.deserialize(new bcs.BcsDeserializer(bytes));
Reference: addressToSCS
BcsEncode
BcsEncode
is based on bcs.BcsSerializer
.
Example:
export function packageHexToTransactionPayloadHex(
packageHex: string
): string {
const transactionPayload = packageHexToTransactionPayload(packageHex)
return bcsEncode(transactionPayload)
}
Reference: packageHexToTransactionPayloadHex
BcsDecode
BcsDecode
is based on bcs.BcsDeserializer
.
Example:
export function decodeEventData(eventName: string, eventData: string): any {
const eventType = onchain_events[eventName];
const d = bcsDecode(
eventType,
eventData
);
return d;
}
Reference: decodeEventData