namillum
Version:
Bubble Protocol SDK
59 lines (53 loc) • 2.05 kB
text/typescript
// @ts-ignore
import abi from 'web3-eth-abi';
import agent from '../abi/Agent.json';
// Constants needed for the `encodeCallsScript` and `encodeAgentExecute` function
const CALLSCRIPT_ID = '0x00000001';
const EMPTY_HEX = '0x00';
function encodeCallsScript(actions) {
return actions.reduce((script, { to, data }) => {
// @ts-ignore
const address = abi.encodeParameter('address', to);
const dataLength = abi
// @ts-ignore
.encodeParameter('uint256', (data.length - 2) / 2)
.toString('hex');
return script + address.slice(26) + dataLength.slice(58) + data.slice(2);
}, CALLSCRIPT_ID);
}
/**
* Encodes an arbitrary agent action into a ready-to-use callsScript, sending 0 ETH.
* The calldata is just an encoded function call which can be made wth abi.encodeFunctionCall,
* using the web3-eth-abi package.
* @param {string} to - The address of the agent.
* @param {string} targetAddress - The address that the agent will call.
* @param {string} calldata - The calldata that the agent will use on the address.
* @returns {string} callsScript - the agent function call, readily encoded into a callscript to be
* used as payload for the disputable delay `delayExecution` call.
*/
function encodeAgentExecute(to, targetAddress, calldata) {
const agentABI = agent.abi.filter(item => item.name === 'execute')[0];
// @ts-ignore
const agentAction = abi.encodeFunctionCall(agentABI, [
targetAddress,
EMPTY_HEX,
calldata
]);
return encodeCallsScript([{ to, data: agentAction }]);
}
export default class Plugin {
public key = 'aragon';
public version = '0.1.2';
public name = 'Aragon Agreements';
public website = 'https://aragon.org/blog/snapshot';
public image =
'https://raw.githubusercontent.com/balancer-labs/snapshot/develop/src/assets/aragon.svg';
public options: any;
execute(options, proposalOptions) {
return encodeAgentExecute(
options.agentAddress,
proposalOptions.actions[0].targetAddress,
proposalOptions.actions[0].calldata
);
}
}