feat: skip unsafe foreign contract calls
This commit is contained in:
118
tools/contract-as-class.js
Normal file
118
tools/contract-as-class.js
Normal file
@@ -0,0 +1,118 @@
|
||||
const {ObjectState} = require('object-rollback');
|
||||
|
||||
class SmartWeaveGlobal {
|
||||
get owner() {
|
||||
return 'ppe';
|
||||
}
|
||||
}
|
||||
|
||||
// base contract that must be extended by all contracts
|
||||
// - contains methods for commit/rollback the state
|
||||
class JsWarpContract {
|
||||
state
|
||||
smartweave
|
||||
#objectState
|
||||
|
||||
constructor(state, smartweave) {
|
||||
this.state = state;
|
||||
this.#objectState = new ObjectState(state);
|
||||
this.smartweave = smartweave;
|
||||
}
|
||||
|
||||
// to be called by SDK
|
||||
get currentState() {
|
||||
return JSON.parse(JSON.stringify(this.state));
|
||||
}
|
||||
|
||||
// to be called by SDK
|
||||
commit() {
|
||||
this.#objectState = new ObjectState(this.state);
|
||||
}
|
||||
|
||||
// to be called by SDK
|
||||
rollback() {
|
||||
this.#objectState.rollback();
|
||||
}
|
||||
}
|
||||
|
||||
// example contract
|
||||
class WarpPst extends JsWarpContract {
|
||||
constructor(initialState, smartweave) {
|
||||
super(initialState, smartweave);
|
||||
}
|
||||
|
||||
transfer(target, qty) {
|
||||
this.#transfer(target, qty);
|
||||
}
|
||||
|
||||
transferAndThrow(target, qty) {
|
||||
this.#transfer(target, qty);
|
||||
throw new Error('Oops!');
|
||||
}
|
||||
|
||||
#transfer(target, qty) {
|
||||
if (!Reflect.has(this.state.balances, target)) {
|
||||
this.state.balances[target] = 0;
|
||||
}
|
||||
this.state.balances[target] += qty;
|
||||
this.state.balances[this.smartweave.owner] -= qty;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function main() {
|
||||
// contract instance
|
||||
const pst = new WarpPst({
|
||||
name: 'just_ppe',
|
||||
ticker: 'ppe',
|
||||
balances: {
|
||||
ppe: 100000000
|
||||
}
|
||||
}, new SmartWeaveGlobal());
|
||||
|
||||
const interactions = [
|
||||
{
|
||||
id: "1",
|
||||
function: 'transfer',
|
||||
args: {
|
||||
target: 'jzi',
|
||||
qty: 100
|
||||
}
|
||||
},
|
||||
{
|
||||
id: "2",
|
||||
function: 'transfer',
|
||||
args: {
|
||||
target: 'jwo',
|
||||
qty: 200
|
||||
}
|
||||
},
|
||||
{
|
||||
id: "3",
|
||||
function: 'transferAndThrow',
|
||||
args: {
|
||||
target: 'xyz',
|
||||
qty: 300
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
console.log('State before', pst.currentState);
|
||||
|
||||
// sdk code
|
||||
interactions.forEach((i) => {
|
||||
try {
|
||||
Reflect.get(pst, i.function).apply(pst, [i.args.target, i.args.qty]);
|
||||
console.log(`State after ${i.id}`, pst.currentState);
|
||||
pst.commit();
|
||||
} catch (e) {
|
||||
console.error(e.message);
|
||||
pst.rollback();
|
||||
}
|
||||
});
|
||||
|
||||
console.log(`End state`, pst.currentState);
|
||||
}
|
||||
|
||||
main();
|
||||
|
||||
Reference in New Issue
Block a user