# Update dappservices contract by msig

To update the dappservices contract to the mainnet version on kylin, run

```
cleos -u https://mainnet.eosn.io get code dappservices --wasm -c dappservices.wasm -a dappservices.abi
```

Take this abi/wasm and put it in a dappservices folder

```
mkdir dappservices
mv dappservices.abi dappservices
mv dappservices.wasm dappservices
```

Then use/modify the following scripts to push the code update by msig on Kylin or Mainnet

**Kylin**

```javascript
const { Api, JsonRpc, RpcError, Serialize } = require('eosjs');
const { JsSignatureProvider } = require('eosjs/dist/eosjs-jssig');      // development only
const fetch = require('node-fetch');                                    // node only; not needed in browsers
const { TextEncoder, TextDecoder } = require('util');   

const defaultPrivateKey = ""; // natdeveloper
const signatureProvider = new JsSignatureProvider([defaultPrivateKey]);

const rpc = new JsonRpc('https://kylin.eosn.io', { fetch });
const rpc2 = new JsonRpc('http://localhost:8888', { fetch });

const api = new Api({ rpc, signatureProvider, textDecoder: new TextDecoder(), textEncoder: new TextEncoder(), abiProvider: rpc2 });
// const api2 = new Api({ rpc2, signatureProvider, textDecoder: new TextDecoder(), textEncoder: new TextEncoder() });

const fs = require('fs');
const wasmFilePath = "./dappservices/dappservices.wasm";
const abiFilePath = "./dappservices/dappservices.abi";

const wasmHexString = fs.readFileSync(wasmFilePath).toString('hex');

const buffer = new Serialize.SerialBuffer({
    textEncoder: api.textEncoder,
    textDecoder: api.textDecoder,
});

let abiJSON = JSON.parse(fs.readFileSync(abiFilePath, 'utf8'));
let abiDefinitions = api.abiTypes.get('abi_def');
abiJSON = abiDefinitions.fields.reduce(
    (acc, { name: fieldName }) =>
        Object.assign(acc, { [fieldName]: acc[fieldName] || [] }),
        abiJSON
    );
abiDefinitions.serialize(buffer, abiJSON);
const serializedAbiHexString = Buffer.from(buffer.asUint8Array()).toString('hex');

const actions = [
        {
          account: 'eosio',
          name: 'setcode',
          authorization: [
            {
              actor: 'dappservices',
              permission: 'active',
            },
          ],
          data: {
            account: 'dappservices',
            code: wasmHexString,
          vmtype: 0,
          vmversion: 0
          },
        },
        {
          account: 'eosio',
          name: 'setabi',
          authorization: [
            {
              actor: 'dappservices',
              permission: 'active',
            },
          ],
          data: {
            account: 'dappservices',
            abi: serializedAbiHexString,
          }
        },    
        {
          account: "dappservices",
          name: "updinflation",
          authorization: [
            {
              actor: "dappservices",
              permission: "active"
            }
          ],
          data: {
            inflation_per_block: 2.2159110624367184e-9
          }
        }
      ];

(async () => {
    try {
//   console.log(api)
//   api.cachedAbis = await api2.getCachedAbi("dappservices");
  console.log(api.cachedAbis);
  const serialized_actions = await api.serializeActions(actions)

  // BUILD THE MULTISIG PROPOSE TRANSACTION
  const proposeInput = {
    proposer: 'natdeveloper',
    proposal_name: 'updinflation',
    requested: [{"actor":"dappservices","permission":"active"}],
    trx: {
      expiration: '2021-07-29T23:11:48',
      ref_block_num: 22480,
      ref_block_prefix: 3659047377,
      max_net_usage_words: 0,
      max_cpu_usage_ms: 0,
      delay_sec: 0,
      context_free_actions: [],
      actions: serialized_actions,
      transaction_extensions: []
    }
  };

  //PROPOSE THE TRANSACTION
  const result = await api.transact({
    actions: [{
      account: 'eosio.msig',
      name: 'propose',
      authorization: [{
        actor: 'natdeveloper',
        permission: 'active',
      }],
      data: proposeInput,
    }]
  }, {
    blocksBehind: 3,
    expireSeconds: 30,
    broadcast: true,
    sign: true
  });
        
    } 
    catch(e) {
        console.log(e)
    }
})();
```

Mainnet

```javascript
const { Api, JsonRpc, RpcError, Serialize } = require('eosjs');
const { JsSignatureProvider } = require('eosjs/dist/eosjs-jssig');      // development only
const fetch = require('node-fetch');                                    // node only; not needed in browsers
const { TextEncoder, TextDecoder } = require('util');   

const defaultPrivateKey = ""; // bob
const signatureProvider = new JsSignatureProvider([defaultPrivateKey]);

const rpc = new JsonRpc('https://mainnet.eosn.io', { fetch });
const rpc2 = new JsonRpc('https://kylin.eosn.io', { fetch });

const api = new Api({ rpc, signatureProvider, textDecoder: new TextDecoder(), textEncoder: new TextEncoder(), abiProvider: rpc2 })
const api2 = new Api({ rpc2, signatureProvider, textDecoder: new TextDecoder(), textEncoder: new TextEncoder() })

const fs = require('fs')
const wasmFilePath = "./dappservices/dappservices.wasm";
const abiFilePath = "./dappservices/dappservices.abi";

const wasmHexString = fs.readFileSync(wasmFilePath).toString('hex')

const buffer = new Serialize.SerialBuffer({
    textEncoder: api.textEncoder,
    textDecoder: api.textDecoder,
})

let abiJSON = JSON.parse(fs.readFileSync(abiFilePath, 'utf8'))
let abiDefinitions = api.abiTypes.get('abi_def')
abiJSON = abiDefinitions.fields.reduce(
    (acc, { name: fieldName }) =>
        Object.assign(acc, { [fieldName]: acc[fieldName] || [] }),
        abiJSON
    )
abiDefinitions.serialize(buffer, abiJSON)
const serializedAbiHexString = Buffer.from(buffer.asUint8Array()).toString('hex')

const actions = [
        {
          account: 'eosio',
          name: 'setcode',
          authorization: [
            {
              actor: 'dappservices',
              permission: 'active',
            },
          ],
          data: {
            account: 'dappservices',
            code: wasmHexString,
          vmtype: 0,
          vmversion: 0
          },
        },
        {
          account: 'eosio',
          name: 'setabi',
          authorization: [
            {
              actor: 'dappservices',
              permission: 'active',
            },
          ],
          data: {
            account: 'dappservices',
            abi: serializedAbiHexString,
          }
        },    
        {
          account: "dappservices",
          name: "updinflation",
          authorization: [
            {
              actor: "dappservices",
              permission: "active"
            }
          ],
          data: {
            inflation_per_block: 2.2159110624367184e-9
          }
        }
      ];

(async () => {
    try {
//   console.log(api)
//   api.cachedAbis = await api2.getCachedAbi("dappservices");
  console.log(api.cachedAbis);
  const serialized_actions = await api.serializeActions(actions)

  // BUILD THE MULTISIG PROPOSE TRANSACTION
  const proposeInput = {
    proposer: 'zlwb4mcq322g',
    proposal_name: 'updinflation',
    requested: [{"actor":"cbrftbkrwwbo","permission":"active"},{"actor":"codeguardian","permission":"active"},{"actor":"cryptolions1","permission":"gov"},{"actor":"dappnetworkk","permission":"active"},{"actor":"dappprovider","permission":"active"},{"actor":"doobiegalnew","permission":"active"},{"actor":"eospheredapp","permission":"active"},{"actor":"everythngeos","permission":"active"},{"actor":"igorlseosrio","permission":"guardian"},{"actor":"ihaveadejavu","permission":"active"},{"actor":"investingwad","permission":"active"},{"actor":"kawrrsytrsbq","permission":"active"},{"actor":"kobybenaroya","permission":"active"},{"actor":"larosenonaka","permission":"active"},{"actor":"mithrilalnce","permission":"active"},{"actor":"mwguardian12","permission":"active"},{"actor":"prjyzjtgxuku","permission":"active"},{"actor":"talmuskaleos","permission":"active"},{"actor":"x452ifggq5va","permission":"active"},{"actor":"xhfq33vt3fg2","permission":"active"},{"actor":"zkwshzdsgdiv","permission":"active"}],
    trx: {
      expiration: '2021-07-29T23:11:48',
      ref_block_num: 22480,
      ref_block_prefix: 3659047377,
      max_net_usage_words: 0,
      max_cpu_usage_ms: 0,
      delay_sec: 604800,
      context_free_actions: [],
      actions: serialized_actions,
      transaction_extensions: []
    }
  };

  //PROPOSE THE TRANSACTION
  const result = await api.transact({
    actions: [{
      account: 'eosio.msig',
      name: 'propose',
      authorization: [{
        actor: 'zlwb4mcq322g',
        permission: 'active',
      }],
      data: proposeInput,
    }]
  }, {
    blocksBehind: 3,
    expireSeconds: 30,
    broadcast: true,
    sign: true
  });
        
    } 
    catch(e) {
        console.log(e)
    }
})();
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.liquidapps.io/liquidapps-documentation/eosio-guides/governance-guides/update-dappservices-contract-by-msig.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
