@btc-vision/btc-runtime
Version:
Bitcoin Smart Contract Runtime
52 lines (37 loc) • 1.94 kB
text/typescript
import { Blockchain } from '../env';
import { BytesWriter } from '../buffer/BytesWriter';
import { BytesReader } from '../buffer/BytesReader';
import { Selector } from '../math/abi';
import { Calldata } from '../types';
import { env_exit, getCalldata, getEnvironmentVariables } from '../env/global';
const ENVIRONMENT_VARIABLES_BYTE_LENGTH: u32 = 304;
export function execute(calldataLength: u32): u32 {
const environmentVariablesBuffer = new ArrayBuffer(ENVIRONMENT_VARIABLES_BYTE_LENGTH);
getEnvironmentVariables(0, ENVIRONMENT_VARIABLES_BYTE_LENGTH, environmentVariablesBuffer);
Blockchain.setEnvironmentVariables(Uint8Array.wrap(environmentVariablesBuffer));
const calldataBuffer = new ArrayBuffer(calldataLength);
getCalldata(0, calldataLength, calldataBuffer);
const calldata: Calldata = new BytesReader(Uint8Array.wrap(calldataBuffer));
const selector: Selector = calldata.readSelector();
Blockchain.onExecutionStarted();
const result: BytesWriter = Blockchain.contract.execute(selector, calldata);
Blockchain.onExecutionCompleted();
const resultBuffer = result.getBuffer().buffer;
const resultLength = resultBuffer.byteLength;
if (resultLength > 0) {
env_exit(0, resultBuffer, resultLength);
}
return 0;
}
export function onDeploy(calldataLength: u32): u32 {
const environmentVariablesBuffer = new ArrayBuffer(ENVIRONMENT_VARIABLES_BYTE_LENGTH);
getEnvironmentVariables(0, ENVIRONMENT_VARIABLES_BYTE_LENGTH, environmentVariablesBuffer);
Blockchain.setEnvironmentVariables(Uint8Array.wrap(environmentVariablesBuffer));
const calldataBuffer = new ArrayBuffer(calldataLength);
getCalldata(0, calldataLength, calldataBuffer);
const calldata: Calldata = new BytesReader(Uint8Array.wrap(calldataBuffer));
Blockchain.onExecutionStarted();
Blockchain.onDeployment(calldata);
Blockchain.onExecutionCompleted();
return 0;
}