@bitgo-beta/sdk-coin-sol 7.6.4-beta.556 → 7.6.4-beta.558
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/src/lib/index.d.ts +1 -0
- package/dist/cjs/src/lib/index.d.ts.map +1 -1
- package/dist/cjs/src/lib/index.js +8 -2
- package/dist/cjs/src/lib/tokenExtensions.d.ts +31 -0
- package/dist/cjs/src/lib/tokenExtensions.d.ts.map +1 -0
- package/dist/cjs/src/lib/tokenExtensions.js +112 -0
- package/dist/cjs/test/unit/tokenExtensions.d.ts +2 -0
- package/dist/cjs/test/unit/tokenExtensions.d.ts.map +1 -0
- package/dist/cjs/test/unit/tokenExtensions.js +32 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/lib/index.d.ts +1 -0
- package/dist/esm/lib/index.d.ts.map +1 -1
- package/dist/esm/lib/index.js +2 -1
- package/dist/esm/lib/tokenExtensions.d.ts +31 -0
- package/dist/esm/lib/tokenExtensions.d.ts.map +1 -0
- package/dist/esm/lib/tokenExtensions.js +105 -0
- package/package.json +7 -7
|
@@ -20,4 +20,5 @@ export { WalletInitializationBuilder } from './walletInitializationBuilder';
|
|
|
20
20
|
export { Interface, Utils };
|
|
21
21
|
export { MessageBuilderFactory } from './messages';
|
|
22
22
|
export { explainSolTransaction, ExplainTransactionWasmOptions } from './explainTransactionWasm';
|
|
23
|
+
export { MintExtensionReadResult, assertExtensionCompatibility, extensionTypeNames, mapModeledExtensions, parseMintExtensions, readMintExtensions, } from './tokenExtensions';
|
|
23
24
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EACL,uBAAuB,EACvB,4BAA4B,EAC5B,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC"}
|
|
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.explainSolTransaction = exports.MessageBuilderFactory = exports.Utils = exports.Interface = exports.WalletInitializationBuilder = exports.TransferBuilderV2 = exports.TransferBuilder = exports.TransactionBuilderFactory = exports.TransactionBuilder = exports.Transaction = exports.TokenTransferBuilder = exports.StakingWithdrawBuilder = exports.StakingRawMsgAuthorizeBuilder = exports.StakingDelegateBuilder = exports.StakingDeactivateBuilder = exports.StakingAuthorizeBuilder = exports.StakingActivateBuilder = exports.KeyPair = exports.CustomInstructionBuilder = exports.CloseAtaBuilder = exports.AtaInitializationBuilder = void 0;
|
|
36
|
+
exports.readMintExtensions = exports.parseMintExtensions = exports.mapModeledExtensions = exports.extensionTypeNames = exports.assertExtensionCompatibility = exports.explainSolTransaction = exports.MessageBuilderFactory = exports.Utils = exports.Interface = exports.WalletInitializationBuilder = exports.TransferBuilderV2 = exports.TransferBuilder = exports.TransactionBuilderFactory = exports.TransactionBuilder = exports.Transaction = exports.TokenTransferBuilder = exports.StakingWithdrawBuilder = exports.StakingRawMsgAuthorizeBuilder = exports.StakingDelegateBuilder = exports.StakingDeactivateBuilder = exports.StakingAuthorizeBuilder = exports.StakingActivateBuilder = exports.KeyPair = exports.CustomInstructionBuilder = exports.CloseAtaBuilder = exports.AtaInitializationBuilder = void 0;
|
|
37
37
|
const Interface = __importStar(require("./iface"));
|
|
38
38
|
exports.Interface = Interface;
|
|
39
39
|
const Utils = __importStar(require("./utils"));
|
|
@@ -76,4 +76,10 @@ var messages_1 = require("./messages");
|
|
|
76
76
|
Object.defineProperty(exports, "MessageBuilderFactory", { enumerable: true, get: function () { return messages_1.MessageBuilderFactory; } });
|
|
77
77
|
var explainTransactionWasm_1 = require("./explainTransactionWasm");
|
|
78
78
|
Object.defineProperty(exports, "explainSolTransaction", { enumerable: true, get: function () { return explainTransactionWasm_1.explainSolTransaction; } });
|
|
79
|
-
|
|
79
|
+
var tokenExtensions_1 = require("./tokenExtensions");
|
|
80
|
+
Object.defineProperty(exports, "assertExtensionCompatibility", { enumerable: true, get: function () { return tokenExtensions_1.assertExtensionCompatibility; } });
|
|
81
|
+
Object.defineProperty(exports, "extensionTypeNames", { enumerable: true, get: function () { return tokenExtensions_1.extensionTypeNames; } });
|
|
82
|
+
Object.defineProperty(exports, "mapModeledExtensions", { enumerable: true, get: function () { return tokenExtensions_1.mapModeledExtensions; } });
|
|
83
|
+
Object.defineProperty(exports, "parseMintExtensions", { enumerable: true, get: function () { return tokenExtensions_1.parseMintExtensions; } });
|
|
84
|
+
Object.defineProperty(exports, "readMintExtensions", { enumerable: true, get: function () { return tokenExtensions_1.readMintExtensions; } });
|
|
85
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQUFxQztBQW9CNUIsOEJBQVM7QUFuQmxCLCtDQUFpQztBQW1CYixzQkFBSztBQWpCekIsdUVBQXNFO0FBQTdELG9JQUFBLHdCQUF3QixPQUFBO0FBQ2pDLHFEQUFvRDtBQUEzQyxrSEFBQSxlQUFlLE9BQUE7QUFDeEIsdUVBQXNFO0FBQTdELG9JQUFBLHdCQUF3QixPQUFBO0FBQ2pDLHFDQUFvQztBQUEzQixrR0FBQSxPQUFPLE9BQUE7QUFDaEIsbUVBQWtFO0FBQXpELGdJQUFBLHNCQUFzQixPQUFBO0FBQy9CLHFFQUFvRTtBQUEzRCxrSUFBQSx1QkFBdUIsT0FBQTtBQUNoQyx1RUFBc0U7QUFBN0Qsb0lBQUEsd0JBQXdCLE9BQUE7QUFDakMsbUVBQWtFO0FBQXpELGdJQUFBLHNCQUFzQixPQUFBO0FBQy9CLGlGQUFnRjtBQUF2RSw4SUFBQSw2QkFBNkIsT0FBQTtBQUN0QyxtRUFBa0U7QUFBekQsZ0lBQUEsc0JBQXNCLE9BQUE7QUFDL0IsK0RBQThEO0FBQXJELDRIQUFBLG9CQUFvQixPQUFBO0FBQzdCLDZDQUE0QztBQUFuQywwR0FBQSxXQUFXLE9BQUE7QUFDcEIsMkRBQTBEO0FBQWpELHdIQUFBLGtCQUFrQixPQUFBO0FBQzNCLHlFQUF3RTtBQUEvRCxzSUFBQSx5QkFBeUIsT0FBQTtBQUNsQyxxREFBb0Q7QUFBM0Msa0hBQUEsZUFBZSxPQUFBO0FBQ3hCLHlEQUF3RDtBQUEvQyxzSEFBQSxpQkFBaUIsT0FBQTtBQUMxQiw2RUFBNEU7QUFBbkUsMElBQUEsMkJBQTJCLE9BQUE7QUFFcEMsdUNBQW1EO0FBQTFDLGlIQUFBLHFCQUFxQixPQUFBO0FBQzlCLG1FQUFnRztBQUF2RiwrSEFBQSxxQkFBcUIsT0FBQTtBQUM5QixxREFPMkI7QUFMekIsK0hBQUEsNEJBQTRCLE9BQUE7QUFDNUIscUhBQUEsa0JBQWtCLE9BQUE7QUFDbEIsdUhBQUEsb0JBQW9CLE9BQUE7QUFDcEIsc0hBQUEsbUJBQW1CLE9BQUE7QUFDbkIscUhBQUEsa0JBQWtCLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBJbnRlcmZhY2UgZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgKiBhcyBVdGlscyBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IHsgQXRhSW5pdGlhbGl6YXRpb25CdWlsZGVyIH0gZnJvbSAnLi9hdGFJbml0aWFsaXphdGlvbkJ1aWxkZXInO1xuZXhwb3J0IHsgQ2xvc2VBdGFCdWlsZGVyIH0gZnJvbSAnLi9jbG9zZUF0YUJ1aWxkZXInO1xuZXhwb3J0IHsgQ3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyIH0gZnJvbSAnLi9jdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXInO1xuZXhwb3J0IHsgS2V5UGFpciB9IGZyb20gJy4va2V5UGFpcic7XG5leHBvcnQgeyBTdGFraW5nQWN0aXZhdGVCdWlsZGVyIH0gZnJvbSAnLi9zdGFraW5nQWN0aXZhdGVCdWlsZGVyJztcbmV4cG9ydCB7IFN0YWtpbmdBdXRob3JpemVCdWlsZGVyIH0gZnJvbSAnLi9zdGFraW5nQXV0aG9yaXplQnVpbGRlcic7XG5leHBvcnQgeyBTdGFraW5nRGVhY3RpdmF0ZUJ1aWxkZXIgfSBmcm9tICcuL3N0YWtpbmdEZWFjdGl2YXRlQnVpbGRlcic7XG5leHBvcnQgeyBTdGFraW5nRGVsZWdhdGVCdWlsZGVyIH0gZnJvbSAnLi9zdGFraW5nRGVsZWdhdGVCdWlsZGVyJztcbmV4cG9ydCB7IFN0YWtpbmdSYXdNc2dBdXRob3JpemVCdWlsZGVyIH0gZnJvbSAnLi9zdGFraW5nUmF3TXNnQXV0aG9yaXplQnVpbGRlcic7XG5leHBvcnQgeyBTdGFraW5nV2l0aGRyYXdCdWlsZGVyIH0gZnJvbSAnLi9zdGFraW5nV2l0aGRyYXdCdWlsZGVyJztcbmV4cG9ydCB7IFRva2VuVHJhbnNmZXJCdWlsZGVyIH0gZnJvbSAnLi90b2tlblRyYW5zZmVyQnVpbGRlcic7XG5leHBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuZXhwb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbkJ1aWxkZXInO1xuZXhwb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4vdHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSc7XG5leHBvcnQgeyBUcmFuc2ZlckJ1aWxkZXIgfSBmcm9tICcuL3RyYW5zZmVyQnVpbGRlcic7XG5leHBvcnQgeyBUcmFuc2ZlckJ1aWxkZXJWMiB9IGZyb20gJy4vdHJhbnNmZXJCdWlsZGVyVjInO1xuZXhwb3J0IHsgV2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyIH0gZnJvbSAnLi93YWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXInO1xuZXhwb3J0IHsgSW50ZXJmYWNlLCBVdGlscyB9O1xuZXhwb3J0IHsgTWVzc2FnZUJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi9tZXNzYWdlcyc7XG5leHBvcnQgeyBleHBsYWluU29sVHJhbnNhY3Rpb24sIEV4cGxhaW5UcmFuc2FjdGlvbldhc21PcHRpb25zIH0gZnJvbSAnLi9leHBsYWluVHJhbnNhY3Rpb25XYXNtJztcbmV4cG9ydCB7XG4gIE1pbnRFeHRlbnNpb25SZWFkUmVzdWx0LFxuICBhc3NlcnRFeHRlbnNpb25Db21wYXRpYmlsaXR5LFxuICBleHRlbnNpb25UeXBlTmFtZXMsXG4gIG1hcE1vZGVsZWRFeHRlbnNpb25zLFxuICBwYXJzZU1pbnRFeHRlbnNpb25zLFxuICByZWFkTWludEV4dGVuc2lvbnMsXG59IGZyb20gJy4vdG9rZW5FeHRlbnNpb25zJztcbiJdfQ==
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { SolTokenExtensions, SolTokenExtensionType } from '@bitgo-beta/statics';
|
|
2
|
+
import { type Mint } from '@solana/spl-token';
|
|
3
|
+
import { Commitment, Connection, PublicKey } from '@solana/web3.js';
|
|
4
|
+
/**
|
|
5
|
+
* Result of reading a Token-2022 mint's extension data.
|
|
6
|
+
*
|
|
7
|
+
* `detectedTypeNames` lists EVERY extension present on the mint — including ones BitGo does
|
|
8
|
+
* not model — so callers can run the onboarding safety gate (`getUnsupportedSolTokenExtensions`).
|
|
9
|
+
* `extensions` is the typed, storable config for the extensions BitGo does model.
|
|
10
|
+
*/
|
|
11
|
+
export interface MintExtensionReadResult {
|
|
12
|
+
detectedTypeNames: string[];
|
|
13
|
+
extensions: SolTokenExtensions;
|
|
14
|
+
}
|
|
15
|
+
/** Human-readable names of every extension type present on the mint. */
|
|
16
|
+
export declare function extensionTypeNames(mintInfo: Mint): string[];
|
|
17
|
+
/** The subset of detected extensions that BitGo models. Pure — unit-testable without chain data. */
|
|
18
|
+
export declare function mapModeledExtensions(detectedTypeNames: readonly string[]): SolTokenExtensionType[];
|
|
19
|
+
/**
|
|
20
|
+
* Enforce the protocol-level incompatibility: Transfer Hook and Confidential
|
|
21
|
+
* Transfer cannot coexist on the same mint. Pure — unit-testable without chain data.
|
|
22
|
+
*/
|
|
23
|
+
export declare function assertExtensionCompatibility(detectedTypeNames: readonly string[]): void;
|
|
24
|
+
/**
|
|
25
|
+
* Parse a decoded Token-2022 `Mint` into BitGo's extension model. Separated from the RPC call
|
|
26
|
+
* so it can be unit-tested against recorded mint fixtures.
|
|
27
|
+
*/
|
|
28
|
+
export declare function parseMintExtensions(mintInfo: Mint): MintExtensionReadResult;
|
|
29
|
+
/** Fetch a Token-2022 mint and parse its extensions. Uses `finalized` commitment rules. */
|
|
30
|
+
export declare function readMintExtensions(connection: Connection, mint: string | PublicKey, commitment?: Commitment): Promise<MintExtensionReadResult>;
|
|
31
|
+
//# sourceMappingURL=tokenExtensions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenExtensions.d.ts","sourceRoot":"","sources":["../../../../src/lib/tokenExtensions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAUL,KAAK,IAAI,EAEV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEpE;;;;;;GAMG;AACH,MAAM,WAAW,uBAAuB;IACtC,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,UAAU,EAAE,kBAAkB,CAAC;CAChC;AAcD,wEAAwE;AACxE,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,IAAI,GAAG,MAAM,EAAE,CAK3D;AAED,oGAAoG;AACpG,wBAAgB,oBAAoB,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,GAAG,qBAAqB,EAAE,CASlG;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAMvF;AAMD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,IAAI,GAAG,uBAAuB,CAyD3E;AAED,2FAA2F;AAC3F,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,UAAU,GAAE,UAAwB,GACnC,OAAO,CAAC,uBAAuB,CAAC,CAIlC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extensionTypeNames = extensionTypeNames;
|
|
4
|
+
exports.mapModeledExtensions = mapModeledExtensions;
|
|
5
|
+
exports.assertExtensionCompatibility = assertExtensionCompatibility;
|
|
6
|
+
exports.parseMintExtensions = parseMintExtensions;
|
|
7
|
+
exports.readMintExtensions = readMintExtensions;
|
|
8
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
9
|
+
const spl_token_1 = require("@solana/spl-token");
|
|
10
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
11
|
+
/** Map from `@solana/spl-token` ExtensionType names to BitGo's modeled extension types. */
|
|
12
|
+
const EXTENSION_NAME_MAP = {
|
|
13
|
+
TransferFeeConfig: statics_1.SolTokenExtensionType.TransferFee,
|
|
14
|
+
TransferHook: statics_1.SolTokenExtensionType.TransferHook,
|
|
15
|
+
PermanentDelegate: statics_1.SolTokenExtensionType.PermanentDelegate,
|
|
16
|
+
InterestBearingConfig: statics_1.SolTokenExtensionType.InterestBearing,
|
|
17
|
+
DefaultAccountState: statics_1.SolTokenExtensionType.DefaultAccountState,
|
|
18
|
+
ScaledUiAmountConfig: statics_1.SolTokenExtensionType.ScaledUiAmount,
|
|
19
|
+
};
|
|
20
|
+
const CONFIDENTIAL_TRANSFER_NAMES = ['ConfidentialTransferMint', 'ConfidentialTransferFeeConfig'];
|
|
21
|
+
/** Human-readable names of every extension type present on the mint. */
|
|
22
|
+
function extensionTypeNames(mintInfo) {
|
|
23
|
+
if (mintInfo.tlvData.length === 0) {
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
return (0, spl_token_1.getExtensionTypes)(mintInfo.tlvData).map((t) => spl_token_1.ExtensionType[t] ?? `unknown(${t})`);
|
|
27
|
+
}
|
|
28
|
+
/** The subset of detected extensions that BitGo models. Pure — unit-testable without chain data. */
|
|
29
|
+
function mapModeledExtensions(detectedTypeNames) {
|
|
30
|
+
const modeled = [];
|
|
31
|
+
for (const name of detectedTypeNames) {
|
|
32
|
+
const mapped = EXTENSION_NAME_MAP[name];
|
|
33
|
+
if (mapped !== undefined && !modeled.includes(mapped)) {
|
|
34
|
+
modeled.push(mapped);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return modeled;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Enforce the protocol-level incompatibility: Transfer Hook and Confidential
|
|
41
|
+
* Transfer cannot coexist on the same mint. Pure — unit-testable without chain data.
|
|
42
|
+
*/
|
|
43
|
+
function assertExtensionCompatibility(detectedTypeNames) {
|
|
44
|
+
const hasHook = detectedTypeNames.includes('TransferHook');
|
|
45
|
+
const hasConfidential = detectedTypeNames.some((n) => CONFIDENTIAL_TRANSFER_NAMES.includes(n));
|
|
46
|
+
if (hasHook && hasConfidential) {
|
|
47
|
+
throw new Error('Mint declares both Transfer Hook and Confidential Transfer, which cannot coexist');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function toBase58(key) {
|
|
51
|
+
return key ? key.toBase58() : undefined;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Parse a decoded Token-2022 `Mint` into BitGo's extension model. Separated from the RPC call
|
|
55
|
+
* so it can be unit-tested against recorded mint fixtures.
|
|
56
|
+
*/
|
|
57
|
+
function parseMintExtensions(mintInfo) {
|
|
58
|
+
const detectedTypeNames = extensionTypeNames(mintInfo);
|
|
59
|
+
assertExtensionCompatibility(detectedTypeNames);
|
|
60
|
+
const extensions = { detected: mapModeledExtensions(detectedTypeNames) };
|
|
61
|
+
const authorities = {
|
|
62
|
+
mintAuthority: toBase58(mintInfo.mintAuthority),
|
|
63
|
+
freezeAuthority: toBase58(mintInfo.freezeAuthority),
|
|
64
|
+
};
|
|
65
|
+
const feeConfig = (0, spl_token_1.getTransferFeeConfig)(mintInfo);
|
|
66
|
+
if (feeConfig) {
|
|
67
|
+
extensions.transferFee = {
|
|
68
|
+
transferFeeBasisPoints: feeConfig.newerTransferFee.transferFeeBasisPoints,
|
|
69
|
+
maximumFee: feeConfig.newerTransferFee.maximumFee.toString(),
|
|
70
|
+
};
|
|
71
|
+
authorities.transferFeeConfigAuthority = toBase58(feeConfig.transferFeeConfigAuthority);
|
|
72
|
+
authorities.withdrawWithheldAuthority = toBase58(feeConfig.withdrawWithheldAuthority);
|
|
73
|
+
}
|
|
74
|
+
const hook = (0, spl_token_1.getTransferHook)(mintInfo);
|
|
75
|
+
if (hook) {
|
|
76
|
+
extensions.transferHookProgramId = hook.programId.toBase58();
|
|
77
|
+
}
|
|
78
|
+
const delegate = (0, spl_token_1.getPermanentDelegate)(mintInfo);
|
|
79
|
+
if (delegate?.delegate) {
|
|
80
|
+
authorities.permanentDelegate = delegate.delegate.toBase58();
|
|
81
|
+
}
|
|
82
|
+
const interest = (0, spl_token_1.getInterestBearingMintConfigState)(mintInfo);
|
|
83
|
+
if (interest) {
|
|
84
|
+
extensions.interestBearing = { rateBasisPoints: interest.currentRate };
|
|
85
|
+
authorities.rateAuthority = toBase58(interest.rateAuthority);
|
|
86
|
+
}
|
|
87
|
+
// DefaultAccountState is a single byte (AccountState). Decoded generically to avoid depending
|
|
88
|
+
// on a version-specific typed getter. permissionlessThaw is NOT on-chain — resolved separately
|
|
89
|
+
// at onboarding; defaults false until confirmed.
|
|
90
|
+
const defaultStateData = (0, spl_token_1.getExtensionData)(spl_token_1.ExtensionType.DefaultAccountState, mintInfo.tlvData);
|
|
91
|
+
if (defaultStateData) {
|
|
92
|
+
extensions.defaultAccountState = {
|
|
93
|
+
frozen: defaultStateData[0] === spl_token_1.AccountState.Frozen,
|
|
94
|
+
permissionlessThaw: false,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
// NOTE: ScaledUiAmount config parsing (initialMultiplier) is intentionally deferred — the typed
|
|
98
|
+
// getter is not available in @solana/spl-token@0.4.9. The extension is still *detected* above
|
|
99
|
+
// (so the safety gate sees it); populating scaledUiAmount.initialMultiplier is a follow-up that
|
|
100
|
+
// bumps @solana/spl-token to a version exposing getScaledUiAmountConfig. See PR for 3.4.
|
|
101
|
+
if (Object.values(authorities).some((v) => v !== undefined)) {
|
|
102
|
+
extensions.authorities = authorities;
|
|
103
|
+
}
|
|
104
|
+
return { detectedTypeNames, extensions };
|
|
105
|
+
}
|
|
106
|
+
/** Fetch a Token-2022 mint and parse its extensions. Uses `finalized` commitment rules. */
|
|
107
|
+
async function readMintExtensions(connection, mint, commitment = 'finalized') {
|
|
108
|
+
const mintPubkey = typeof mint === 'string' ? new web3_js_1.PublicKey(mint) : mint;
|
|
109
|
+
const mintInfo = await (0, spl_token_1.getMint)(connection, mintPubkey, commitment, spl_token_1.TOKEN_2022_PROGRAM_ID);
|
|
110
|
+
return parseMintExtensions(mintInfo);
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5FeHRlbnNpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi90b2tlbkV4dGVuc2lvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUF5Q0EsZ0RBS0M7QUFHRCxvREFTQztBQU1ELG9FQU1DO0FBVUQsa0RBeURDO0FBR0QsZ0RBUUM7QUFwSkQsaURBQWdGO0FBQ2hGLGlEQVkyQjtBQUMzQiw2Q0FBb0U7QUFjcEUsMkZBQTJGO0FBQzNGLE1BQU0sa0JBQWtCLEdBQW9EO0lBQzFFLGlCQUFpQixFQUFFLCtCQUFxQixDQUFDLFdBQVc7SUFDcEQsWUFBWSxFQUFFLCtCQUFxQixDQUFDLFlBQVk7SUFDaEQsaUJBQWlCLEVBQUUsK0JBQXFCLENBQUMsaUJBQWlCO0lBQzFELHFCQUFxQixFQUFFLCtCQUFxQixDQUFDLGVBQWU7SUFDNUQsbUJBQW1CLEVBQUUsK0JBQXFCLENBQUMsbUJBQW1CO0lBQzlELG9CQUFvQixFQUFFLCtCQUFxQixDQUFDLGNBQWM7Q0FDM0QsQ0FBQztBQUVGLE1BQU0sMkJBQTJCLEdBQUcsQ0FBQywwQkFBMEIsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO0FBRWxHLHdFQUF3RTtBQUN4RSxTQUFnQixrQkFBa0IsQ0FBQyxRQUFjO0lBQy9DLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbEMsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0QsT0FBTyxJQUFBLDZCQUFpQixFQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLHlCQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzdGLENBQUM7QUFFRCxvR0FBb0c7QUFDcEcsU0FBZ0Isb0JBQW9CLENBQUMsaUJBQW9DO0lBQ3ZFLE1BQU0sT0FBTyxHQUE0QixFQUFFLENBQUM7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QUFDLENBQUM7SUFDMUYsT0FBTyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU29sVG9rZW5FeHRlbnNpb25zLCBTb2xUb2tlbkV4dGVuc2lvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7XG4gIEFjY291bnRTdGF0ZSxcbiAgRXh0ZW5zaW9uVHlwZSxcbiAgZ2V0RXh0ZW5zaW9uRGF0YSxcbiAgZ2V0RXh0ZW5zaW9uVHlwZXMsXG4gIGdldEludGVyZXN0QmVhcmluZ01pbnRDb25maWdTdGF0ZSxcbiAgZ2V0TWludCxcbiAgZ2V0UGVybWFuZW50RGVsZWdhdGUsXG4gIGdldFRyYW5zZmVyRmVlQ29uZmlnLFxuICBnZXRUcmFuc2Zlckhvb2ssXG4gIHR5cGUgTWludCxcbiAgVE9LRU5fMjAyMl9QUk9HUkFNX0lELFxufSBmcm9tICdAc29sYW5hL3NwbC10b2tlbic7XG5pbXBvcnQgeyBDb21taXRtZW50LCBDb25uZWN0aW9uLCBQdWJsaWNLZXkgfSBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuXG4vKipcbiAqIFJlc3VsdCBvZiByZWFkaW5nIGEgVG9rZW4tMjAyMiBtaW50J3MgZXh0ZW5zaW9uIGRhdGEuXG4gKlxuICogYGRldGVjdGVkVHlwZU5hbWVzYCBsaXN0cyBFVkVSWSBleHRlbnNpb24gcHJlc2VudCBvbiB0aGUgbWludCDigJQgaW5jbHVkaW5nIG9uZXMgQml0R28gZG9lc1xuICogbm90IG1vZGVsIOKAlCBzbyBjYWxsZXJzIGNhbiBydW4gdGhlIG9uYm9hcmRpbmcgc2FmZXR5IGdhdGUgKGBnZXRVbnN1cHBvcnRlZFNvbFRva2VuRXh0ZW5zaW9uc2ApLlxuICogYGV4dGVuc2lvbnNgIGlzIHRoZSB0eXBlZCwgc3RvcmFibGUgY29uZmlnIGZvciB0aGUgZXh0ZW5zaW9ucyBCaXRHbyBkb2VzIG1vZGVsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1pbnRFeHRlbnNpb25SZWFkUmVzdWx0IHtcbiAgZGV0ZWN0ZWRUeXBlTmFtZXM6IHN0cmluZ1tdO1xuICBleHRlbnNpb25zOiBTb2xUb2tlbkV4dGVuc2lvbnM7XG59XG5cbi8qKiBNYXAgZnJvbSBgQHNvbGFuYS9zcGwtdG9rZW5gIEV4dGVuc2lvblR5cGUgbmFtZXMgdG8gQml0R28ncyBtb2RlbGVkIGV4dGVuc2lvbiB0eXBlcy4gKi9cbmNvbnN0IEVYVEVOU0lPTl9OQU1FX01BUDogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgU29sVG9rZW5FeHRlbnNpb25UeXBlPj4gPSB7XG4gIFRyYW5zZmVyRmVlQ29uZmlnOiBTb2xUb2tlbkV4dGVuc2lvblR5cGUuVHJhbnNmZXJGZWUsXG4gIFRyYW5zZmVySG9vazogU29sVG9rZW5FeHRlbnNpb25UeXBlLlRyYW5zZmVySG9vayxcbiAgUGVybWFuZW50RGVsZWdhdGU6IFNvbFRva2VuRXh0ZW5zaW9uVHlwZS5QZXJtYW5lbnREZWxlZ2F0ZSxcbiAgSW50ZXJlc3RCZWFyaW5nQ29uZmlnOiBTb2xUb2tlbkV4dGVuc2lvblR5cGUuSW50ZXJlc3RCZWFyaW5nLFxuICBEZWZhdWx0QWNjb3VudFN0YXRlOiBTb2xUb2tlbkV4dGVuc2lvblR5cGUuRGVmYXVsdEFjY291bnRTdGF0ZSxcbiAgU2NhbGVkVWlBbW91bnRDb25maWc6IFNvbFRva2VuRXh0ZW5zaW9uVHlwZS5TY2FsZWRVaUFtb3VudCxcbn07XG5cbmNvbnN0IENPTkZJREVOVElBTF9UUkFOU0ZFUl9OQU1FUyA9IFsnQ29uZmlkZW50aWFsVHJhbnNmZXJNaW50JywgJ0NvbmZpZGVudGlhbFRyYW5zZmVyRmVlQ29uZmlnJ107XG5cbi8qKiBIdW1hbi1yZWFkYWJsZSBuYW1lcyBvZiBldmVyeSBleHRlbnNpb24gdHlwZSBwcmVzZW50IG9uIHRoZSBtaW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuc2lvblR5cGVOYW1lcyhtaW50SW5mbzogTWludCk6IHN0cmluZ1tdIHtcbiAgaWYgKG1pbnRJbmZvLnRsdkRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiBnZXRFeHRlbnNpb25UeXBlcyhtaW50SW5mby50bHZEYXRhKS5tYXAoKHQpID0+IEV4dGVuc2lvblR5cGVbdF0gPz8gYHVua25vd24oJHt0fSlgKTtcbn1cblxuLyoqIFRoZSBzdWJzZXQgb2YgZGV0ZWN0ZWQgZXh0ZW5zaW9ucyB0aGF0IEJpdEdvIG1vZGVscy4gUHVyZSDigJQgdW5pdC10ZXN0YWJsZSB3aXRob3V0IGNoYWluIGRhdGEuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwTW9kZWxlZEV4dGVuc2lvbnMoZGV0ZWN0ZWRUeXBlTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogU29sVG9rZW5FeHRlbnNpb25UeXBlW10ge1xuICBjb25zdCBtb2RlbGVkOiBTb2xUb2tlbkV4dGVuc2lvblR5cGVbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgZGV0ZWN0ZWRUeXBlTmFtZXMpIHtcbiAgICBjb25zdCBtYXBwZWQgPSBFWFRFTlNJT05fTkFNRV9NQVBbbmFtZV07XG4gICAgaWYgKG1hcHBlZCAhPT0gdW5kZWZpbmVkICYmICFtb2RlbGVkLmluY2x1ZGVzKG1hcHBlZCkpIHtcbiAgICAgIG1vZGVsZWQucHVzaChtYXBwZWQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbW9kZWxlZDtcbn1cblxuLyoqXG4gKiBFbmZvcmNlIHRoZSBwcm90b2NvbC1sZXZlbCBpbmNvbXBhdGliaWxpdHk6IFRyYW5zZmVyIEhvb2sgYW5kIENvbmZpZGVudGlhbFxuICogVHJhbnNmZXIgY2Fubm90IGNvZXhpc3Qgb24gdGhlIHNhbWUgbWludC4gUHVyZSDigJQgdW5pdC10ZXN0YWJsZSB3aXRob3V0IGNoYWluIGRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRFeHRlbnNpb25Db21wYXRpYmlsaXR5KGRldGVjdGVkVHlwZU5hbWVzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICBjb25zdCBoYXNIb29rID0gZGV0ZWN0ZWRUeXBlTmFtZXMuaW5jbHVkZXMoJ1RyYW5zZmVySG9vaycpO1xuICBjb25zdCBoYXNDb25maWRlbnRpYWwgPSBkZXRlY3RlZFR5cGVOYW1lcy5zb21lKChuKSA9PiBDT05GSURFTlRJQUxfVFJBTlNGRVJfTkFNRVMuaW5jbHVkZXMobikpO1xuICBpZiAoaGFzSG9vayAmJiBoYXNDb25maWRlbnRpYWwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01pbnQgZGVjbGFyZXMgYm90aCBUcmFuc2ZlciBIb29rIGFuZCBDb25maWRlbnRpYWwgVHJhbnNmZXIsIHdoaWNoIGNhbm5vdCBjb2V4aXN0Jyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9CYXNlNTgoa2V5OiBQdWJsaWNLZXkgfCBudWxsKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGtleSA/IGtleS50b0Jhc2U1OCgpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgZGVjb2RlZCBUb2tlbi0yMDIyIGBNaW50YCBpbnRvIEJpdEdvJ3MgZXh0ZW5zaW9uIG1vZGVsLiBTZXBhcmF0ZWQgZnJvbSB0aGUgUlBDIGNhbGxcbiAqIHNvIGl0IGNhbiBiZSB1bml0LXRlc3RlZCBhZ2FpbnN0IHJlY29yZGVkIG1pbnQgZml4dHVyZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU1pbnRFeHRlbnNpb25zKG1pbnRJbmZvOiBNaW50KTogTWludEV4dGVuc2lvblJlYWRSZXN1bHQge1xuICBjb25zdCBkZXRlY3RlZFR5cGVOYW1lcyA9IGV4dGVuc2lvblR5cGVOYW1lcyhtaW50SW5mbyk7XG4gIGFzc2VydEV4dGVuc2lvbkNvbXBhdGliaWxpdHkoZGV0ZWN0ZWRUeXBlTmFtZXMpO1xuXG4gIGNvbnN0IGV4dGVuc2lvbnM6IFNvbFRva2VuRXh0ZW5zaW9ucyA9IHsgZGV0ZWN0ZWQ6IG1hcE1vZGVsZWRFeHRlbnNpb25zKGRldGVjdGVkVHlwZU5hbWVzKSB9O1xuICBjb25zdCBhdXRob3JpdGllczogTm9uTnVsbGFibGU8U29sVG9rZW5FeHRlbnNpb25zWydhdXRob3JpdGllcyddPiA9IHtcbiAgICBtaW50QXV0aG9yaXR5OiB0b0Jhc2U1OChtaW50SW5mby5taW50QXV0aG9yaXR5KSxcbiAgICBmcmVlemVBdXRob3JpdHk6IHRvQmFzZTU4KG1pbnRJbmZvLmZyZWV6ZUF1dGhvcml0eSksXG4gIH07XG5cbiAgY29uc3QgZmVlQ29uZmlnID0gZ2V0VHJhbnNmZXJGZWVDb25maWcobWludEluZm8pO1xuICBpZiAoZmVlQ29uZmlnKSB7XG4gICAgZXh0ZW5zaW9ucy50cmFuc2ZlckZlZSA9IHtcbiAgICAgIHRyYW5zZmVyRmVlQmFzaXNQb2ludHM6IGZlZUNvbmZpZy5uZXdlclRyYW5zZmVyRmVlLnRyYW5zZmVyRmVlQmFzaXNQb2ludHMsXG4gICAgICBtYXhpbXVtRmVlOiBmZWVDb25maWcubmV3ZXJUcmFuc2ZlckZlZS5tYXhpbXVtRmVlLnRvU3RyaW5nKCksXG4gICAgfTtcbiAgICBhdXRob3JpdGllcy50cmFuc2ZlckZlZUNvbmZpZ0F1dGhvcml0eSA9IHRvQmFzZTU4KGZlZUNvbmZpZy50cmFuc2ZlckZlZUNvbmZpZ0F1dGhvcml0eSk7XG4gICAgYXV0aG9yaXRpZXMud2l0aGRyYXdXaXRoaGVsZEF1dGhvcml0eSA9IHRvQmFzZTU4KGZlZUNvbmZpZy53aXRoZHJhd1dpdGhoZWxkQXV0aG9yaXR5KTtcbiAgfVxuXG4gIGNvbnN0IGhvb2sgPSBnZXRUcmFuc2Zlckhvb2sobWludEluZm8pO1xuICBpZiAoaG9vaykge1xuICAgIGV4dGVuc2lvbnMudHJhbnNmZXJIb29rUHJvZ3JhbUlkID0gaG9vay5wcm9ncmFtSWQudG9CYXNlNTgoKTtcbiAgfVxuXG4gIGNvbnN0IGRlbGVnYXRlID0gZ2V0UGVybWFuZW50RGVsZWdhdGUobWludEluZm8pO1xuICBpZiAoZGVsZWdhdGU/LmRlbGVnYXRlKSB7XG4gICAgYXV0aG9yaXRpZXMucGVybWFuZW50RGVsZWdhdGUgPSBkZWxlZ2F0ZS5kZWxlZ2F0ZS50b0Jhc2U1OCgpO1xuICB9XG5cbiAgY29uc3QgaW50ZXJlc3QgPSBnZXRJbnRlcmVzdEJlYXJpbmdNaW50Q29uZmlnU3RhdGUobWludEluZm8pO1xuICBpZiAoaW50ZXJlc3QpIHtcbiAgICBleHRlbnNpb25zLmludGVyZXN0QmVhcmluZyA9IHsgcmF0ZUJhc2lzUG9pbnRzOiBpbnRlcmVzdC5jdXJyZW50UmF0ZSB9O1xuICAgIGF1dGhvcml0aWVzLnJhdGVBdXRob3JpdHkgPSB0b0Jhc2U1OChpbnRlcmVzdC5yYXRlQXV0aG9yaXR5KTtcbiAgfVxuXG4gIC8vIERlZmF1bHRBY2NvdW50U3RhdGUgaXMgYSBzaW5nbGUgYnl0ZSAoQWNjb3VudFN0YXRlKS4gRGVjb2RlZCBnZW5lcmljYWxseSB0byBhdm9pZCBkZXBlbmRpbmdcbiAgLy8gb24gYSB2ZXJzaW9uLXNwZWNpZmljIHR5cGVkIGdldHRlci4gcGVybWlzc2lvbmxlc3NUaGF3IGlzIE5PVCBvbi1jaGFpbiDigJQgcmVzb2x2ZWQgc2VwYXJhdGVseVxuICAvLyBhdCBvbmJvYXJkaW5nOyBkZWZhdWx0cyBmYWxzZSB1bnRpbCBjb25maXJtZWQuXG4gIGNvbnN0IGRlZmF1bHRTdGF0ZURhdGEgPSBnZXRFeHRlbnNpb25EYXRhKEV4dGVuc2lvblR5cGUuRGVmYXVsdEFjY291bnRTdGF0ZSwgbWludEluZm8udGx2RGF0YSk7XG4gIGlmIChkZWZhdWx0U3RhdGVEYXRhKSB7XG4gICAgZXh0ZW5zaW9ucy5kZWZhdWx0QWNjb3VudFN0YXRlID0ge1xuICAgICAgZnJvemVuOiBkZWZhdWx0U3RhdGVEYXRhWzBdID09PSBBY2NvdW50U3RhdGUuRnJvemVuLFxuICAgICAgcGVybWlzc2lvbmxlc3NUaGF3OiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgLy8gTk9URTogU2NhbGVkVWlBbW91bnQgY29uZmlnIHBhcnNpbmcgKGluaXRpYWxNdWx0aXBsaWVyKSBpcyBpbnRlbnRpb25hbGx5IGRlZmVycmVkIOKAlCB0aGUgdHlwZWRcbiAgLy8gZ2V0dGVyIGlzIG5vdCBhdmFpbGFibGUgaW4gQHNvbGFuYS9zcGwtdG9rZW5AMC40LjkuIFRoZSBleHRlbnNpb24gaXMgc3RpbGwgKmRldGVjdGVkKiBhYm92ZVxuICAvLyAoc28gdGhlIHNhZmV0eSBnYXRlIHNlZXMgaXQpOyBwb3B1bGF0aW5nIHNjYWxlZFVpQW1vdW50LmluaXRpYWxNdWx0aXBsaWVyIGlzIGEgZm9sbG93LXVwIHRoYXRcbiAgLy8gYnVtcHMgQHNvbGFuYS9zcGwtdG9rZW4gdG8gYSB2ZXJzaW9uIGV4cG9zaW5nIGdldFNjYWxlZFVpQW1vdW50Q29uZmlnLiBTZWUgUFIgZm9yIDMuNC5cblxuICBpZiAoT2JqZWN0LnZhbHVlcyhhdXRob3JpdGllcykuc29tZSgodikgPT4gdiAhPT0gdW5kZWZpbmVkKSkge1xuICAgIGV4dGVuc2lvbnMuYXV0aG9yaXRpZXMgPSBhdXRob3JpdGllcztcbiAgfVxuXG4gIHJldHVybiB7IGRldGVjdGVkVHlwZU5hbWVzLCBleHRlbnNpb25zIH07XG59XG5cbi8qKiBGZXRjaCBhIFRva2VuLTIwMjIgbWludCBhbmQgcGFyc2UgaXRzIGV4dGVuc2lvbnMuIFVzZXMgYGZpbmFsaXplZGAgY29tbWl0bWVudCBydWxlcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkTWludEV4dGVuc2lvbnMoXG4gIGNvbm5lY3Rpb246IENvbm5lY3Rpb24sXG4gIG1pbnQ6IHN0cmluZyB8IFB1YmxpY0tleSxcbiAgY29tbWl0bWVudDogQ29tbWl0bWVudCA9ICdmaW5hbGl6ZWQnXG4pOiBQcm9taXNlPE1pbnRFeHRlbnNpb25SZWFkUmVzdWx0PiB7XG4gIGNvbnN0IG1pbnRQdWJrZXkgPSB0eXBlb2YgbWludCA9PT0gJ3N0cmluZycgPyBuZXcgUHVibGljS2V5KG1pbnQpIDogbWludDtcbiAgY29uc3QgbWludEluZm8gPSBhd2FpdCBnZXRNaW50KGNvbm5lY3Rpb24sIG1pbnRQdWJrZXksIGNvbW1pdG1lbnQsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gIHJldHVybiBwYXJzZU1pbnRFeHRlbnNpb25zKG1pbnRJbmZvKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenExtensions.d.ts","sourceRoot":"","sources":["../../../../test/unit/tokenExtensions.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
require("should");
|
|
4
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
5
|
+
const tokenExtensions_1 = require("../../src/lib/tokenExtensions");
|
|
6
|
+
describe('Sol Token-2022 mint extension parsing', function () {
|
|
7
|
+
describe('mapModeledExtensions', function () {
|
|
8
|
+
it('maps spl-token extension names to modeled BitGo types', function () {
|
|
9
|
+
(0, tokenExtensions_1.mapModeledExtensions)(['TransferFeeConfig', 'PermanentDelegate']).should.eql([
|
|
10
|
+
statics_1.SolTokenExtensionType.TransferFee,
|
|
11
|
+
statics_1.SolTokenExtensionType.PermanentDelegate,
|
|
12
|
+
]);
|
|
13
|
+
});
|
|
14
|
+
it('ignores extensions BitGo does not model', function () {
|
|
15
|
+
(0, tokenExtensions_1.mapModeledExtensions)(['ImmutableOwner', 'MetadataPointer', 'TransferHook']).should.eql([
|
|
16
|
+
statics_1.SolTokenExtensionType.TransferHook,
|
|
17
|
+
]);
|
|
18
|
+
});
|
|
19
|
+
it('deduplicates', function () {
|
|
20
|
+
(0, tokenExtensions_1.mapModeledExtensions)(['TransferFeeConfig', 'TransferFeeConfig']).should.eql([statics_1.SolTokenExtensionType.TransferFee]);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
describe('assertExtensionCompatibility', function () {
|
|
24
|
+
it('throws when Transfer Hook and Confidential Transfer coexist', function () {
|
|
25
|
+
(() => (0, tokenExtensions_1.assertExtensionCompatibility)(['TransferHook', 'ConfidentialTransferMint'])).should.throw(/cannot coexist/);
|
|
26
|
+
});
|
|
27
|
+
it('allows Transfer Hook without Confidential Transfer', function () {
|
|
28
|
+
(() => (0, tokenExtensions_1.assertExtensionCompatibility)(['TransferHook', 'TransferFeeConfig'])).should.not.throw();
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5FeHRlbnNpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3Rva2VuRXh0ZW5zaW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtCQUFnQjtBQUNoQixpREFBNEQ7QUFDNUQsbUVBQW1HO0FBRW5HLFFBQVEsQ0FBQyx1Q0FBdUMsRUFBRTtJQUNoRCxRQUFRLENBQUMsc0JBQXNCLEVBQUU7UUFDL0IsRUFBRSxDQUFDLHVEQUF1RCxFQUFFO1lBQzFELElBQUEsc0NBQW9CLEVBQUMsQ0FBQyxtQkFBbUIsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztnQkFDMUUsK0JBQXFCLENBQUMsV0FBVztnQkFDakMsK0JBQXFCLENBQUMsaUJBQWlCO2FBQ3hDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHlDQUF5QyxFQUFFO1lBQzVDLElBQUEsc0NBQW9CLEVBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7Z0JBQ3JGLCtCQUFxQixDQUFDLFlBQVk7YUFDbkMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsY0FBYyxFQUFFO1lBQ2pCLElBQUEsc0NBQW9CLEVBQUMsQ0FBQyxtQkFBbUIsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLCtCQUFxQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDbkgsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyw4QkFBOEIsRUFBRTtRQUN2QyxFQUFFLENBQUMsNkRBQTZELEVBQUU7WUFDaEUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFBLDhDQUE0QixFQUFDLENBQUMsY0FBYyxFQUFFLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNwSCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxvREFBb0QsRUFBRTtZQUN2RCxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUEsOENBQTRCLEVBQUMsQ0FBQyxjQUFjLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqRyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBTb2xUb2tlbkV4dGVuc2lvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IGFzc2VydEV4dGVuc2lvbkNvbXBhdGliaWxpdHksIG1hcE1vZGVsZWRFeHRlbnNpb25zIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi90b2tlbkV4dGVuc2lvbnMnO1xuXG5kZXNjcmliZSgnU29sIFRva2VuLTIwMjIgbWludCBleHRlbnNpb24gcGFyc2luZycsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ21hcE1vZGVsZWRFeHRlbnNpb25zJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdtYXBzIHNwbC10b2tlbiBleHRlbnNpb24gbmFtZXMgdG8gbW9kZWxlZCBCaXRHbyB0eXBlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1hcE1vZGVsZWRFeHRlbnNpb25zKFsnVHJhbnNmZXJGZWVDb25maWcnLCAnUGVybWFuZW50RGVsZWdhdGUnXSkuc2hvdWxkLmVxbChbXG4gICAgICAgIFNvbFRva2VuRXh0ZW5zaW9uVHlwZS5UcmFuc2ZlckZlZSxcbiAgICAgICAgU29sVG9rZW5FeHRlbnNpb25UeXBlLlBlcm1hbmVudERlbGVnYXRlLFxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaWdub3JlcyBleHRlbnNpb25zIEJpdEdvIGRvZXMgbm90IG1vZGVsJywgZnVuY3Rpb24gKCkge1xuICAgICAgbWFwTW9kZWxlZEV4dGVuc2lvbnMoWydJbW11dGFibGVPd25lcicsICdNZXRhZGF0YVBvaW50ZXInLCAnVHJhbnNmZXJIb29rJ10pLnNob3VsZC5lcWwoW1xuICAgICAgICBTb2xUb2tlbkV4dGVuc2lvblR5cGUuVHJhbnNmZXJIb29rLFxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZGVkdXBsaWNhdGVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgbWFwTW9kZWxlZEV4dGVuc2lvbnMoWydUcmFuc2ZlckZlZUNvbmZpZycsICdUcmFuc2ZlckZlZUNvbmZpZyddKS5zaG91bGQuZXFsKFtTb2xUb2tlbkV4dGVuc2lvblR5cGUuVHJhbnNmZXJGZWVdKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Fzc2VydEV4dGVuc2lvbkNvbXBhdGliaWxpdHknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Rocm93cyB3aGVuIFRyYW5zZmVyIEhvb2sgYW5kIENvbmZpZGVudGlhbCBUcmFuc2ZlciBjb2V4aXN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgKCgpID0+IGFzc2VydEV4dGVuc2lvbkNvbXBhdGliaWxpdHkoWydUcmFuc2Zlckhvb2snLCAnQ29uZmlkZW50aWFsVHJhbnNmZXJNaW50J10pKS5zaG91bGQudGhyb3coL2Nhbm5vdCBjb2V4aXN0Lyk7XG4gICAgfSk7XG5cbiAgICBpdCgnYWxsb3dzIFRyYW5zZmVyIEhvb2sgd2l0aG91dCBDb25maWRlbnRpYWwgVHJhbnNmZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAoKCkgPT4gYXNzZXJ0RXh0ZW5zaW9uQ29tcGF0aWJpbGl0eShbJ1RyYW5zZmVySG9vaycsICdUcmFuc2ZlckZlZUNvbmZpZyddKSkuc2hvdWxkLm5vdC50aHJvdygpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|