feat: add an option to read wallet balance at a given height
This commit is contained in:
@@ -233,7 +233,7 @@ export class HandlerBasedContract<State> implements Contract<State> {
|
|||||||
}
|
}
|
||||||
const interactionTx = await this.createInteraction(input, tags, emptyTransfer, strict);
|
const interactionTx = await this.createInteraction(input, tags, emptyTransfer, strict);
|
||||||
|
|
||||||
const response = await fetch(`${this._evaluationOptions.bundlerAddress}gateway/sequencer/register`, {
|
const response = await fetch(`${this._evaluationOptions.bundlerUrl}gateway/sequencer/register`, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
body: JSON.stringify(interactionTx),
|
body: JSON.stringify(interactionTx),
|
||||||
headers: {
|
headers: {
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ export class DefaultEvaluationOptions implements EvaluationOptions {
|
|||||||
saveState: false
|
saveState: false
|
||||||
};
|
};
|
||||||
|
|
||||||
bundlerAddress = 'https://gateway.redstone.finance/';
|
bundlerUrl = 'https://gateway.redstone.finance/';
|
||||||
|
|
||||||
gasLimit = Number.MAX_SAFE_INTEGER;
|
gasLimit = Number.MAX_SAFE_INTEGER;
|
||||||
|
|
||||||
@@ -115,6 +115,8 @@ export class DefaultEvaluationOptions implements EvaluationOptions {
|
|||||||
useVM2 = false;
|
useVM2 = false;
|
||||||
|
|
||||||
allowUnsafeClient = false;
|
allowUnsafeClient = false;
|
||||||
|
|
||||||
|
walletBalanceUrl = 'http://nyc-1.dev.arweave.net:1984/';
|
||||||
}
|
}
|
||||||
|
|
||||||
// an interface for the contract EvaluationOptions - can be used to change the behaviour of some of the features.
|
// an interface for the contract EvaluationOptions - can be used to change the behaviour of some of the features.
|
||||||
@@ -159,7 +161,7 @@ export interface EvaluationOptions {
|
|||||||
saveState: boolean;
|
saveState: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
bundlerAddress: string;
|
bundlerUrl: string;
|
||||||
|
|
||||||
gasLimit: number;
|
gasLimit: number;
|
||||||
|
|
||||||
@@ -181,4 +183,7 @@ export interface EvaluationOptions {
|
|||||||
// if set to false - calling unsafe clinet in contract code will
|
// if set to false - calling unsafe clinet in contract code will
|
||||||
// result in throwing an exception
|
// result in throwing an exception
|
||||||
allowUnsafeClient: boolean;
|
allowUnsafeClient: boolean;
|
||||||
|
|
||||||
|
// an endpoint for retrieving wallet balance info
|
||||||
|
walletBalanceUrl: string;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,10 +46,14 @@ export class HandlerExecutorFactory implements ExecutorFactory<HandlerApi<unknow
|
|||||||
contractDefinition: ContractDefinition<State>,
|
contractDefinition: ContractDefinition<State>,
|
||||||
evaluationOptions: EvaluationOptions
|
evaluationOptions: EvaluationOptions
|
||||||
): Promise<HandlerApi<State>> {
|
): Promise<HandlerApi<State>> {
|
||||||
const swGlobal = new SmartWeaveGlobal(this.arweave, {
|
const swGlobal = new SmartWeaveGlobal(
|
||||||
id: contractDefinition.txId,
|
this.arweave,
|
||||||
owner: contractDefinition.owner
|
{
|
||||||
});
|
id: contractDefinition.txId,
|
||||||
|
owner: contractDefinition.owner
|
||||||
|
},
|
||||||
|
evaluationOptions
|
||||||
|
);
|
||||||
|
|
||||||
if (contractDefinition.contractType == 'wasm') {
|
if (contractDefinition.contractType == 'wasm') {
|
||||||
this.logger.info('Creating handler for wasm contract', contractDefinition.txId);
|
this.logger.info('Creating handler for wasm contract', contractDefinition.txId);
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
/* eslint-disable */
|
/* eslint-disable */
|
||||||
import Arweave from 'arweave';
|
import Arweave from 'arweave';
|
||||||
import { GQLNodeInterface, GQLTagInterface } from './gqlResult';
|
import { GQLNodeInterface, GQLTagInterface } from './gqlResult';
|
||||||
|
import {EvaluationOptions} from "@smartweave/core";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@@ -51,9 +52,9 @@ export class SmartWeaveGlobal {
|
|||||||
|
|
||||||
caller?: string;
|
caller?: string;
|
||||||
|
|
||||||
constructor(arweave: Arweave, contract: { id: string; owner: string }, gasLimit = Number.MAX_SAFE_INTEGER) {
|
constructor(arweave: Arweave, contract: { id: string; owner: string }, evaluationOptions: EvaluationOptions) {
|
||||||
this.gasUsed = 0;
|
this.gasUsed = 0;
|
||||||
this.gasLimit = gasLimit;
|
this.gasLimit = Number.MAX_SAFE_INTEGER;
|
||||||
this.unsafeClient = arweave;
|
this.unsafeClient = arweave;
|
||||||
this.arweave = {
|
this.arweave = {
|
||||||
ar: arweave.ar,
|
ar: arweave.ar,
|
||||||
@@ -61,6 +62,24 @@ export class SmartWeaveGlobal {
|
|||||||
wallets: arweave.wallets,
|
wallets: arweave.wallets,
|
||||||
crypto: arweave.crypto
|
crypto: arweave.crypto
|
||||||
};
|
};
|
||||||
|
this.arweave.wallets.getBalance = async (address: string): Promise<string> => {
|
||||||
|
if (!this._activeTx) {
|
||||||
|
throw new Error("Cannot read balance - active tx is not set.");
|
||||||
|
}
|
||||||
|
if (!this.block.height) {
|
||||||
|
throw new Error("Cannot read balance - block height not set.")
|
||||||
|
}
|
||||||
|
console.log(`${evaluationOptions.walletBalanceUrl}block/height/${this.block.height}/wallet/${address}/balance`);
|
||||||
|
|
||||||
|
// http://nyc-1.dev.arweave.net:1984/block/height/914387/wallet/M-mpNeJbg9h7mZ-uHaNsa5jwFFRAq0PsTkNWXJ-ojwI/balance
|
||||||
|
return await fetch(`${evaluationOptions.walletBalanceUrl}block/height/${this.block.height}/wallet/${address}/balance`)
|
||||||
|
.then((res) => {
|
||||||
|
return res.ok ? res.text() : Promise.reject(res);
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
throw new Error(`Unable to read wallet balance. ${error.status}. ${error.body?.message}`);
|
||||||
|
});
|
||||||
|
}
|
||||||
this.contract = contract;
|
this.contract = contract;
|
||||||
this.transaction = new Transaction(this);
|
this.transaction = new Transaction(this);
|
||||||
this.block = new Block(this);
|
this.block = new Block(this);
|
||||||
|
|||||||
@@ -1,9 +1,20 @@
|
|||||||
export function handle(state, action) {
|
export async function handle(state, action) {
|
||||||
const balances = state.balances;
|
const balances = state.balances;
|
||||||
const canEvolve = state.canEvolve;
|
const canEvolve = state.canEvolve;
|
||||||
const input = action.input;
|
const input = action.input;
|
||||||
const caller = action.caller;
|
const caller = action.caller;
|
||||||
|
|
||||||
|
if (input.function === 'storeBalance') {
|
||||||
|
const target = input.target;
|
||||||
|
const height = SmartWeave.block.height;
|
||||||
|
if (state.wallets.height === undefined) {
|
||||||
|
state.wallets[height] = {};
|
||||||
|
}
|
||||||
|
state.wallets[height][target] = await SmartWeave.arweave.wallets.getBalance(target);
|
||||||
|
|
||||||
|
return { state };
|
||||||
|
}
|
||||||
|
|
||||||
if (input.function === 'transfer') {
|
if (input.function === 'transfer') {
|
||||||
const target = input.target;
|
const target = input.target;
|
||||||
const qty = input.qty;
|
const qty = input.qty;
|
||||||
@@ -34,7 +45,7 @@ export function handle(state, action) {
|
|||||||
balances[target] = qty;
|
balances[target] = qty;
|
||||||
}
|
}
|
||||||
|
|
||||||
return { state };
|
return {state};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (input.function === 'balance') {
|
if (input.function === 'balance') {
|
||||||
@@ -49,7 +60,7 @@ export function handle(state, action) {
|
|||||||
throw new ContractError('Cannot get balance, target does not exist');
|
throw new ContractError('Cannot get balance, target does not exist');
|
||||||
}
|
}
|
||||||
|
|
||||||
return { result: { target, ticker, balance: balances[target] } };
|
return {result: {target, ticker, balance: balances[target]}};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (input.function === 'evolve' && canEvolve) {
|
if (input.function === 'evolve' && canEvolve) {
|
||||||
@@ -59,8 +70,9 @@ export function handle(state, action) {
|
|||||||
|
|
||||||
state.evolve = input.value;
|
state.evolve = input.value;
|
||||||
|
|
||||||
return { state };
|
return {state};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
throw new ContractError(`No function supplied or function not recognised: "${input.function}"`);
|
throw new ContractError(`No function supplied or function not recognised: "${input.function}"`);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,5 +5,6 @@
|
|||||||
"balances": {
|
"balances": {
|
||||||
"uhE-QeYS8i4pmUtnxQyHD7dzXFNaJ9oMK-IM-QPNY6M": 10000000,
|
"uhE-QeYS8i4pmUtnxQyHD7dzXFNaJ9oMK-IM-QPNY6M": 10000000,
|
||||||
"33F0QHcb22W7LwWR1iRC8Az1ntZG09XQ03YWuw2ABqA": 23111222
|
"33F0QHcb22W7LwWR1iRC8Az1ntZG09XQ03YWuw2ABqA": 23111222
|
||||||
}
|
},
|
||||||
|
"wallets": {}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,11 +28,11 @@ async function main() {
|
|||||||
const initialState = fs.readFileSync(path.join(__dirname, 'data/js/token-pst.json'), 'utf8');
|
const initialState = fs.readFileSync(path.join(__dirname, 'data/js/token-pst.json'), 'utf8');
|
||||||
|
|
||||||
// case 1 - full deploy, js contract
|
// case 1 - full deploy, js contract
|
||||||
const contractTxId = await smartweave.createContract.deploy({
|
/* const contractTxId = await smartweave.createContract.deploy({
|
||||||
wallet,
|
wallet,
|
||||||
initState: initialState,
|
initState: initialState,
|
||||||
src: jsContractSrc,
|
src: jsContractSrc,
|
||||||
}, true);
|
}, true);*/
|
||||||
|
|
||||||
// case 2 - deploy from source, js contract
|
// case 2 - deploy from source, js contract
|
||||||
/*const contractTxId = await smartweave.createContract.deployFromSourceTx({
|
/*const contractTxId = await smartweave.createContract.deployFromSourceTx({
|
||||||
@@ -57,7 +57,14 @@ async function main() {
|
|||||||
srcTxId: "5wXT-A0iugP9pWEyw-iTbB0plZ_AbmvlNKyBfGS3AUY",
|
srcTxId: "5wXT-A0iugP9pWEyw-iTbB0plZ_AbmvlNKyBfGS3AUY",
|
||||||
}, true);*/
|
}, true);*/
|
||||||
|
|
||||||
const {state, validity} = await smartweave.contract(contractTxId).readState();
|
const contract = smartweave.contract("CRMRwP-poSTYI7f9fI-vF0CKaTTJTIl74KQYbnJ4hnE").connect(wallet);
|
||||||
|
|
||||||
|
const result = await contract.writeInteraction<any>({
|
||||||
|
function: "storeBalance",
|
||||||
|
target: "M-mpNeJbg9h7mZ-uHaNsa5jwFFRAq0PsTkNWXJ-ojwI",
|
||||||
|
});
|
||||||
|
|
||||||
|
//const {state, validity} = await contract.readState();
|
||||||
|
|
||||||
//logger.info("Result", state);
|
//logger.info("Result", state);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user