crosschain.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. const { promisify } = require('util');
  2. const BridgeAMBMock = artifacts.require('BridgeAMBMock');
  3. const BridgeArbitrumL1Mock = artifacts.require('BridgeArbitrumL1Mock');
  4. const BridgeArbitrumL2Mock = artifacts.require('BridgeArbitrumL2Mock');
  5. const BridgeOptimismMock = artifacts.require('BridgeOptimismMock');
  6. const BridgePolygonChildMock = artifacts.require('BridgePolygonChildMock');
  7. class BridgeHelper {
  8. static async deploy(type) {
  9. return new BridgeHelper(await deployBridge(type));
  10. }
  11. constructor(bridge) {
  12. this.bridge = bridge;
  13. this.address = bridge.address;
  14. }
  15. call(from, target, selector = undefined, args = []) {
  16. return this.bridge.relayAs(
  17. target.address || target,
  18. selector ? target.contract.methods[selector](...args).encodeABI() : '0x',
  19. from,
  20. );
  21. }
  22. }
  23. async function deployBridge(type = 'Arbitrum-L2') {
  24. switch (type) {
  25. case 'AMB':
  26. return BridgeAMBMock.new();
  27. case 'Arbitrum-L1':
  28. return BridgeArbitrumL1Mock.new();
  29. case 'Arbitrum-L2': {
  30. const instance = await BridgeArbitrumL2Mock.new();
  31. const code = await web3.eth.getCode(instance.address);
  32. await promisify(web3.currentProvider.send.bind(web3.currentProvider))({
  33. jsonrpc: '2.0',
  34. method: 'hardhat_setCode',
  35. params: ['0x0000000000000000000000000000000000000064', code],
  36. id: new Date().getTime(),
  37. });
  38. return BridgeArbitrumL2Mock.at('0x0000000000000000000000000000000000000064');
  39. }
  40. case 'Optimism':
  41. return BridgeOptimismMock.new();
  42. case 'Polygon-Child':
  43. return BridgePolygonChildMock.new();
  44. default:
  45. throw new Error(`CrossChain: ${type} is not supported`);
  46. }
  47. }
  48. module.exports = {
  49. BridgeHelper,
  50. };